有两个表:
A   B   C   D
aa  。  。  。
ab  。  。  。
E   A
1   aa
1   aa
1   aa
2   aa
2   aa
2   ab想得到这样的表
A   B   C   D   F
aa  。  。  。  1,2
ab  。  。  。  2
请问怎么写这个sql?

解决方案 »

  1.   

    [sql server] 字段合并
    http://blog.csdn.net/xys_777/archive/2010/07/07/5718036.aspx
      

  2.   

    --建立测试环境
    IF OBJECT_ID('tb') IS NOT NULL  DROP TABLE tb
    GO
    CREATE TABLE tb
    (
    a varchar(10), 
    b varchar(10),
    c varchar(10), 
        d varchar(10)
    )
    GO
    INSERT TB
    SELECT 'aa' ,'。', '。','。' union all
    SELECT 'ab' ,'。', '。','。' 
    goIF OBJECT_ID('tb1') IS NOT NULL  DROP TABLE tb1
    GO
    CREATE TABLE tb1
    (
    e int, 
    a varchar(10)
    )
    GO
    INSERT TB1
    SELECT 1,'aa'  union all
    SELECT 1,'aa'  union all
    SELECT 1,'aa'  union all
    SELECT 2,'aa'  union all
    SELECT 2,'aa'  union all
    SELECT 2,'ab' 
    go
    --查询--2000
    IF OBJECT_ID('f_str') IS NOT NULL  DROP function f_str
    GO
    create function dbo.f_str(@a varchar(10)) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ',' +  cast( e as varchar) from (select distinct * from  tb1) t where a = @a
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go--调用函数
    select a.* , f = dbo.f_str(a.a) from tb a left join (select distinct * from tb1 )b on a.a=b.a group by a.a,a.b,a.c,a.d
    --结果
    /*
    a          b          c          d          f
    ---------- ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------
    aa         。          。          。          1,2
    ab         。          。          。          2(2 行受影响)*/
      

  3.   

    --2005
    select a.*, f = stuff((select ',' + cast( e as varchar) 
    from (select distinct * from tb1 ) t 
    where a = a.a for xml path('')) , 1 , 1 , '')
     from tb a left join (select distinct * from tb1 )b on a.a=b.a 
    group by a.a,a.b,a.c,a.d/*
    a          b          c          d          f
    ---------- ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    aa         。          。          。          1,2
    ab         。          。          。          2(2 行受影响)
    */
      

  4.   


    create table tb(A varchar(2), B varchar(10))
    insert into tb values( 'aa','AA')
    insert into tb values( 'ab','AB')create table tb2(E int, A varchar(2))
    insert into tb2 values( 1,'aa')
    insert into tb2 values( 1,'aa')
    insert into tb2 values( 2,'aa')
    insert into tb2 values( 2,'aa')
    insert into tb2 values( 2,'ab')
    go
    select t1.*,t2.E FROM tb t1 left join (
    select A, [E]=stuff((select DISTINCT ','+CONVERT(VARCHAR(2),[E]) from tb2 t where A=tb2.A for xml path('')), 1, 1, '')
    from tb2
    group by A) t2 on t1.A = t2.Adrop table tb
    drop table tb2
    (1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)
    A    B          E
    ---- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    aa   AA         1,2
    ab   AB         2(2 行受影响)