Как объединить несколько строк? - PullRequest
1 голос
/ 26 июня 2010

У меня следующий запрос, который возвращает зарплату всем сотрудникам.Это прекрасно работает, но мне нужно собрать дополнительные данные, которые я собираю в одну ячейку (см. Набор результатов 2).

Как я могу объединить данные в список через запятую?Немного похоже на то, что делает Sum, но мне нужна строка в ответ.

SELECT Employee.Id, SUM(Pay) as Salary
FROM Employee
INNER JOIN PayCheck ON PayCheck.EmployeeId = Employee.Id
GROUP BY Employee.Id

Result Set 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

Ответы [ 2 ]

3 голосов
/ 26 июня 2010

Для 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

Но вам не хватает сведений о том, где находятся данные, которые вы хотите преобразовать в строку с разделителями-запятыми, и как они относятся к записи сотрудника ...

0 голосов
/ 26 июня 2010

У меня нет своего кода передо мной, или я бы показал вам быстрый пример, но я бы хотел написать агрегат CLR для этого. Это очень просто. Существует несколько автоматически созданных методов, которые можно использовать, и они предназначены только для сбора (добавить в объект List <> или чего-то еще), объединения (объединения нескольких списков, созданных в нескольких потоках) и вывода (взять список и превратить его в строка - String.Join (",", list.ToArray ())). Единственное, что нужно знать, это то, что ограничение длины составляет 8000 символов.

...