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