Объединить значения на основе идентификатора - PullRequest
10 голосов
/ 07 июля 2011

У меня есть таблица с именем 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

Теперь я хочу, чтобы на выходе отображалась одна строка для каждого идентификатора, а значения из Label объединялись и разделялись запятой

Мой вывод должен выглядеть так:

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

Как я могу это сделать:

Ответы [ 4 ]

10 голосов
/ 07 июля 2011

Вы не можете быть уверены в порядке объединения строк без оператора order by в подзапросе. Часть .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
1 голос
/ 07 июля 2011
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;
1 голос
/ 07 июля 2011

Проверьте ссылку ниже, она подходит к вашей проблеме с различными решениями

* ** 1003 тысячи два *http://www.simple -talk.com / SQL / T-SQL-программирование / конкатенация-строка-значения-в-Transact-SQL /
0 голосов
/ 07 июля 2011

Учтите, что это очень производительно:

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

Избегайте функций XML, потому что они не производительны.

Это потребует некоторых усилий для реализации, номиллионы строк => миллисекунд для запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...