基于ID连接值

我有一个名为Results的表,数据如下所示:

Response_ID Label 12147 It was not clear 12458 Did not Undersstand 12458 Was not resolved 12458 Did not communicate 12586 Spoke too fast 12587 Too slow 

现在我想要输出每个ID显示一行,并从标签的值被连接和逗号分隔

我的输出应该如下所示:

 Response_ID Label 12147 It was not clear 12458 Did not Undersstand,Was not resolved,Did not communicate 12586 Spoke too fast 12587 Too Slow 

我该如何做到这一点:

您不能确定在子查询中没有按语句顺序连接的string的顺序。 .value('.', 'varchar(max)')部分用于处理Label包含XML等不友好字符(例如&

 declare @T table(Response_ID int, Label varchar(50)) insert into @T values (12147, 'It was not clear'), (12458, 'Did not Undersstand'), (12458, 'Was not resolved'), (12458, 'Did not communicate'), (12586, 'Spoke too fast'), (12587, 'Too slow') select T1.Response_ID, stuff((select ','+T2.Label from @T as T2 where T1.Response_ID = T2.Response_ID for xml path(''), type).value('.', 'varchar(max)'), 1, 1, '') as Label from @T as T1 group by T1.Response_ID 

检查下面的链接,它用许多不同的解决scheme来解决您的问题

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

 DECLARE @Results TABLE(Response_ID INT, Label VARCHAR(80)); INSERT @Results(Response_ID, Label) SELECT 12147,'It was not clear' UNION SELECT 12458,'Did not Undersstand' UNION SELECT 12458,'Was not resolved' UNION SELECT 12458,'Did not communicate' UNION SELECT 12586,'Spoke too fast' UNION SELECT 12587,'Too slow'; WITH x AS ( SELECT Response_ID FROM @Results GROUP BY Response_ID ) SELECT x.Response_ID, Label = STUFF((SELECT ',' + Label FROM @Results WHERE Response_ID = x.Response_ID FOR XML PATH('')), 1, 1, '') FROM x; 

考虑一下,这是非常高效的:

http://jerrytech.blogspot.com/2010/04/tsql-concatenate-strings-1-2-3-and.html

避免XML函数,因为它们不是高性能的。

这将需要一些努力来实现,但数百万行=>毫秒运行。