如何连接多行?

时间:2010-06-25 20:02:32

标签: sql sql-server string tsql sql-server-group-concat

我有以下查询返回所有员工的薪水。这项工作非常完美,但我需要收集额外的数据,我将汇总到一个单元格中(参见结果集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

2 个答案:

答案 0 :(得分:3)

对于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

但是,您缺少有关要将数据转换为逗号分隔字符串的位置的详细信息,以及它与员工记录的关系......

答案 1 :(得分:0)

我没有在我面前的代码,或者我会向您展示一个快速示例,但我会考虑为此编写CLR聚合。它非常简单。有一些自动创建的方法可供使用,它们只是用于收集(添加到List<>对象或其他东西),Merge(合并多个线程中创建的多个列表)和输出(获取列表并将其转换)到一个字符串 - String.Join(“,”,list.ToArray()))。唯一要知道的是长度限制为8000个字符。