1

我有以下查询,它返回所有员工的工资。这工作得很好,但我需要收集额外的数据,我将汇总到一个单元格中(参见结果集 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
4

2 回答 2

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

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

于 2010-06-25T20:18:53.313 回答
0

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

于 2010-06-25T20:08:18.837 回答