Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何连接多行?_Sql_Sql Server_String_Tsql_Sql Server Group Concat - Fatal编程技术网

Sql 如何连接多行?

Sql 如何连接多行?,sql,sql-server,string,tsql,sql-server-group-concat,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

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

我面前没有我的代码,或者我会给你看一个简单的例子,但我会考虑为此编写一个CLR聚合。这很简单。有一些自动创建的方法可供使用,它们仅用于收集(添加到列表对象或其他对象)、合并(合并在多个线程中创建的多个列表)和输出(获取列表并将其转换为字符串-string.Join(“,”,List.ToArray()))。唯一需要知道的是,长度限制为8000个字符。

对于SQL Server 2005+,请使用STUFF函数,对于XML路径:

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

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

可能与@Martin的和重复这最后一个有一个更好的示例,在“分组方式”中使用它,还有一个使用自定义CLR聚合的选项。可能我在这里遗漏了一些内容,但是,您从哪里获得额外的数据呢?SqlServer 2017现在具有STRING_AGG,它使用给定的分隔符将多个字符串聚合为一个字符串。(不允许发布重复问题的重复答案。)这不能正确处理XML特殊字符,如
&
。因此,如果您的_table.data包含
one&two
,您将得到
one&;结果集中有两个
。有一种巧妙的方法来处理此问题,请参见: