比如有一个"人"表ID 姓名 年龄 性别 备注 (可能有更多的列)
1  张三 null 男   AAA
2  张三 19   null BBB
3  张三 20   null CCC要把这个表的数据,倒到另一个新表,而新表,屋的时候,只需要一行关于"张三"这个人的信息,原来的表里可能有多行关于"张三"的信息,现在只需要一行,但要把原来表中的数据提炼出来,如果有min(ID),得到的张三的年龄就是null,现在要:如果哪列,有数据,就把有的提取出来,如果重复,只要一个就行。但备注字段,要多行数据相加现在就想要这样的ID 姓名 年龄 性别 备注 (可能有更多的列)
1  张三 19   男   AAA+BBB+CCC或者ID 姓名 年龄 性别 备注 (可能有更多的列)
1  张三 20   男   AAA+BBB+CCC有没有什么好办法呀

解决方案 »

  1.   

    select 姓名,
    max(年龄) as 年龄,max(性别) as 性别,
    (select ''+备注 from [人] where [姓名]=a.姓名 for xml path('')) as 备注 
    from [人] as a
    group by 姓名
      

  2.   

    use Tempdb
    go
    --> --> 
     
    if not object_id(N'Tempdb..#T') is null
    drop table #T
    Go
    Create table #T([ID] int,[姓名] nvarchar(2),[年龄] int,[性别] nvarchar(1),[备注] nvarchar(3))
    Insert #T
    select 1,N'张三',null,N'男',N'AAA' union all
    select 2,N'张三',19,null,N'BBB' union all
    select 3,N'张三',20,null,N'CCC'
    Go
    select 姓名,
    max(年龄) as 年龄,max(性别) as 性别,
    (select ''+备注 from #T where [姓名]=a.姓名 for xml path('')) as 备注 
    from #T as a
    group by 姓名
    /*
    姓名 年龄 性别 备注
    张三 20 男 AAABBBCCC
    */
      

  3.   


    CREATE table tb 
    (ID int,姓名 varchar(4),年龄 int,性别 varchar(2),备注 varchar(3))
    insert into tb
    select 1,'张三',null,'男','AAA' union all
    select 2,'张三',19,null,'BBB' union all
    select 3,'张三',20,null,'CCC'SELECT  ID = MIN(ID) ,
            姓名 ,
            年龄 = MIN(年龄) ,
            性别 = MIN(性别) ,
            备注 = STUFF(( SELECT '+' + 备注
                         FROM   tb t
                         WHERE  姓名 = tb.姓名
                       FOR
                         XML PATH('')
                       ), 1, 1, '')
    FROM    tb
    GROUP BY 姓名 DROP TABLE tb
    /*
    ID          姓名   年龄          性别   备注
    ----------- ---- ----------- ---- ---------------
    1           张三   19          男    AAA+BBB+CCC
    */
      

  4.   

    加上"+"時select 姓名,
    max(年龄) as 年龄,max(性别) as 性别,
    STUFF((select '+'+备注 from #T where [姓名]=a.姓名 for xml path(''))  ,1,1,'')as 备注
    from #T as a
    group by 姓名
    /*
    姓名 年龄 性别 备注
    张三 20 男 AAA+BBB+CCC
    */
      

  5.   

    select
     姓名,
     max(年龄) as 年龄,max(性别) as 性别,
     stuff((select '+'+备注 from tb where [姓名]=t.姓名 for xml path(''))  ,1,1,'') as 备注
    from
     tb t
    group by
     姓名