如何连接每个ID 3列的值?

时间:2014-07-10 13:03:58

标签: sql sql-server sql-server-2008

考虑下表#temp

objectid  field1  field2  field3
--------------------------------
1         X       001     foo
2         Y       022     bar
2         Z       033     baz
3         A       111     abc
3         B       222     def
3         C       333     ghi
4         Q       900     tom

对于每个目标,我需要连接field1field2field3

objectid  field1  field2       field3
------------------------------------------
1         X       001          foo
2         Y;Z     022;033      barbaz
3         A;B;C   111;222;333  abc;def;ghi
4         Q       900          tom

我首先只针对field1执行此操作,如下所示:

select
    c.FLUSObjectNumber,
    [field1] = stuff(
    (
      select ';' + field1 
      from #temp as c2 
      where c2.objectid = c.objectid and c2.field1 = c.field1
      for xml path(''), type
     ).value('.', 'varchar(max)'), 1, 1, ''
)
from #temp c
group by c.objectid, c.field1
;

但是,这会返回#temp中已有的列表。

我做错了什么?如何生成所需的输出?

4 个答案:

答案 0 :(得分:2)

declare @t table (objectid INT, field1 VARCHAR(50),  field2 VARCHAR(50), field3 VARCHAR(50))
INSERT INTO @t (objectid,field1,field2,field3)values (1,'X','001','foo')
INSERT INTO @t (objectid,field1,field2,field3)values (2,'Y','022','bar')
INSERT INTO @t (objectid,field1,field2,field3)values (2,'Z','033','baz')
INSERT INTO @t (objectid,field1,field2,field3)values (3,'A','111','abc')
INSERT INTO @t (objectid,field1,field2,field3)values (3,'B','222','def')
INSERT INTO @t (objectid,field1,field2,field3)values (3,'C','333','ghi')
INSERT INTO @t (objectid,field1,field2,field3)values (4,'Q','900','tom')


Select distinct t.objectid ,
    STUFF((Select distinct ','  + t1.field1 
        from @t t1 
    where t.objectid = t1.objectid 
    ORDER BY 1
    FOR XML PATH(''))
                        , 1, 1, '')As field,

    STUFF((Select distinct  ','  +  t2.field2  
        from @t t2 
    where t.objectid = T2.objectid 
    ORDER BY 1
    FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)') 
                        , 1,  1, ' ')As field2,
    STUFF((Select distinct ','  +  T3.field3 
        from @t t3 
    where t.objectid = t3.objectid 
    ORDER BY 1
    FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)') 
                        , 1,  1, ' ')As field3
                         from @t t

                     group by
                            t.objectid

答案 1 :(得分:1)

DECLARE @Temp TABLE
(
    objectid INT,
    field1 VARCHAR(20),
    field2 VARCHAR(20),
    field3 VARCHAR(20)
)

INSERT INTO @Temp
( objectid, field1, field2, field3 )
VALUES
(1         ,'X'       ,'001'     ,'foo'),
(2         ,'Y'       ,'022'     ,'bar'),
(2         ,'Z'       ,'033'     ,'baz'),
(3         ,'A'       ,'111'     ,'abc'),
(3         ,'B'       ,'222'     ,'def'),
(3         ,'C'       ,'333'     ,'ghi'),
(4         ,'Q'       ,'900'     ,'tom');

SELECT DISTINCT t.objectid, f1.f1, f2.f2, f3.f3 
FROM @Temp t
OUTER APPLY
(
    SELECT STUFF((SELECT ',' + Field1 FROM @Temp WHERE objectid = t.objectid ORDER BY field1 FOR XML PATH('')),1,1,'') f1
) f1
OUTER APPLY
(
    SELECT STUFF((SELECT ',' + Field2 FROM @Temp WHERE objectid = t.objectid ORDER BY field2 FOR XML PATH('')),1,1,'') f2
) f2
OUTER APPLY
(
    SELECT STUFF((SELECT ',' + Field3 FROM @Temp WHERE objectid = t.objectid ORDER BY field1 FOR XML PATH('')),1,1,'') f3
) f3

输出:

objectid        f1        f2           f3
1               X         001          foo
2               Y,Z       022,033      bar,baz
3               A,B,C     111,222,333  abc,def,ghi
4               Q         900          tom

答案 2 :(得分:1)

你不需要外部申请或其他任何东西,试试这个:

    SELECT DISTINCT t.objectid, 
    (SELECT STUFF((SELECT ';' + Field1 FROM #temp WHERE objectid = t.objectid ORDER BY field1 FOR XML PATH('')),1,1,'')) AS [field1], 
    (SELECT STUFF((SELECT ';' + Field2 FROM #temp WHERE objectid = t.objectid ORDER BY field2 FOR XML PATH('')),1,1,'')) AS [field2],
    (SELECT STUFF((SELECT ';' + Field3 FROM #temp WHERE objectid = t.objectid ORDER BY field1 FOR XML PATH('')),1,1,'')) AS [field3]
    FROM #temp t

答案 3 :(得分:0)

您错过了从正确的表格中field1子句中获取STUFF

select
    c.FLUSObjectNumber,
    [field1] = stuff(
    (
      select ';' + c2.field1 
      from #temp as c2 
      where c2.objectid = c.objectid and c2.field1 = c.field1
      for xml path(''), type
     ).value('.', 'varchar(max)'), 1, 1, ''
)
from #temp c
group by c.objectid, c.field1
;