Как конкатенировать несколько строк?

У меня есть следующий запрос, который возвращает зарплату всех сотрудников. Это работает отлично, но мне нужно собрать дополнительные данные, которые я буду агрегировать в одну ячейку (см. 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 символов.