表名:家庭表   
家庭地址 户主姓名   姓名
234号     徐志明    徐志明
234号     徐志明    陈隆福
234号     徐志明    张泉林
235号     李尧根    李尧根
235号     李尧根    吴阿大
235号     李尧根    李关金怎么样的sql,才能写成:家庭地址 户主姓名   姓名      家庭人数  家庭成员
234号     徐志明    徐志明       3      徐志明,徐隆福,徐泉林
234号     徐志明    徐隆福       3      徐志明,徐隆福,徐泉林
234号     徐志明    徐泉林       3      徐志明,徐隆福,徐泉林
235号     李尧根    李尧根       2      李尧根,李阿大
235号     李尧根    李阿大       2      李尧根,李阿大 

解决方案 »

  1.   

    create function f_str(@dz varchar(10))
    returns varchar(200)
    as
    begin
       declare @s varchar(200)
       select @s = isnull(@s+','+'') +  姓名 from 家庭表 where 家庭地址 = @dz
       return @s
    end 
    goselect *,dbo.f_str(家庭地址)
    from 家庭表
      

  2.   

    create function f_str(@dz varchar(10))
    returns varchar(200)
    as
    begin
       declare @s varchar(200)
       select @s = isnull(@s+','+'') +  姓名 from 家庭表 where 家庭地址 = @dz
       return @s
    end 
    goselect *,
           家庭人数 = (select count(1) from 家庭表 where 家庭地址 = a.家庭地址),
           dbo.f_str(家庭地址)
    from 家庭表 a
      

  3.   

    --> 测试数据: #T
    if object_id('tempdb.dbo.#T') is not null drop table #T
    create table #T (家庭地址 varchar(5),户主姓名 varchar(6),姓名 varchar(6))
    insert into #T
    select '234号','徐志明','徐志明' union all
    select '234号','徐志明','陈隆福' union all
    select '234号','徐志明','张泉林' union all
    select '235号','李尧根','李尧根' union all
    select '235号','李尧根','吴阿大' union all
    select '235号','李尧根','李关金'select 家庭地址,户主姓名, 姓名=(stuff((select ','+姓名 from #T where 家庭地址=a.家庭地址 and 户主姓名=a.户主姓名 for xml path('')),1,1,'')) from #T a/*
    家庭地址 户主姓名  姓名
    -----    -------- ------------------------
    234号    徐志明   徐志明,陈隆福,张泉林
    234号    徐志明   徐志明,陈隆福,张泉林
    234号    徐志明   徐志明,陈隆福,张泉林
    235号    李尧根   李尧根,吴阿大,李关金
    235号    李尧根   李尧根,吴阿大,李关金
    235号    李尧根   李尧根,吴阿大,李关金
    */