考虑下表#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
对于每个目标,我需要连接field1
,field2
和field3
:
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
中已有的列表。
我做错了什么?如何生成所需的输出?
答案 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
;