Как конкатенировать несколько строк?
У меня есть следующий запрос, который возвращает зарплату всех сотрудников. Это работает отлично, но мне нужно собрать дополнительные данные, которые я буду агрегировать в одну ячейку (см. Result Set 2).
Как я могу объединить данные в список, разделенный запятыми? Немного похоже на то, что делает Sum, но мне нужна строка в ответ.
SELECT Employee.Id, SUM(Pay) as Salary
FROM Employee
INNER JOIN PayCheck ON PayCheck.EmployeeId = Employee.Id
GROUP BY Employee.Id
Набор результатов 1
Employee.Id Salary
-----------------------------------
1 150
2 250
3 350
Мне нужно:
Набор результатов 2
Employee.Id Salary Data
----------------------------------------------------
1 150 One, Two, Three
2 250 Four, Five, Six
3 350 Seven
Ответы
Ответ 1
Для SQL Server 2005+ используйте функцию STUFF и FOR XML PATH:
WITH summary_cte AS (
SELECT Employee.Id, SUM(Pay) as Salary
FROM Employee
JOIN PayCheck ON PayCheck.EmployeeId = Employee.Id
GROUP BY Employee.Id)
SELECT sc.id,
sc.salary,
STUFF((SELECT ','+ yt.data
FROM your_table yt
WHERE yt.id = sc.id
GROUP BY yt.data
FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '')
FROM summary_cte sc
Но вам не хватает информации о том, где данные, которые вы хотите превратить в строку с разделителями-запятыми, и как это относится к записи сотрудника...
Ответ 2
У меня нет моего кода передо мной, или я бы показал вам быстрый пример, но я бы рассмотрел возможность создания для этого агрегата CLR. Это очень просто. Есть несколько автоматически созданных методов для использования, и они предназначены только для коллекции (добавить в объект List < > или что-то еще), Merge (объединение нескольких списков, созданных в нескольких потоках), и вывод (возьмите список и переведите его в строка - String.Join( ",", list.ToArray())). Единственное, что нужно знать, это ограничение длины в 8000 символов.