Объединить значения, основанные на идентификаторе
У меня есть таблица под названием "Результаты", и данные выглядят следующим образом:
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
Теперь я хочу, чтобы вывод отображал одну строку на идентификатор, а значения из метки были объединены и разделены запятой
Мой вывод должен выглядеть так:
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
Как это сделать:
Ответы
Ответ 1
Вы не можете быть уверены в том, что порядок строк конкатенирован без указания порядка в подзапросе. Часть .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
Ответ 2
Проверьте приведенную ниже ссылку, она подходит к вашей проблеме со множеством различных решений.
http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
Ответ 3
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;
Ответ 4
Считаем, что это очень результативно:
http://jerrytech.blogspot.com/2010/04/tsql-concatenate-strings-1-2-3-and.html
Избегайте функций XML, потому что они не работают.
Это потребует некоторых усилий для реализации, но миллионы строк = > миллисекунды для запуска.