如何连接多行?

Posted

技术标签:

【中文标题】如何连接多行?【英文标题】:How to concatenate multiple rows? 【发布时间】:2010-06-25 20:02:32 【问题描述】:

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

【问题讨论】:

How do I Create a Comma-Separated List using a SQL Query? 和 ***.com/questions/3087684/… @Martin 的可能重复项,最后一个有一个更好的例子,可以在“GROUP BY”中使用它。还有一个使用自定义 CLR 聚合的选项。 也许我在这里遗漏了一些东西,但是你从哪里获得额外的数据? SqlServer 2017 现在有 STRING_AGG,它使用给定的分隔符将多个字符串聚合为一个。 (不允许发布重复问题的重复答案。) 【参考方案1】:

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

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

【讨论】:

这不能正确处理 XML 特殊字符,例如 >&。因此,如果 your_table.data 包含one & two,您将在结果集中得到one & two。有一种很好的方法来处理这个问题,请参阅:***.com/questions/5031204/…【参考方案2】:

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

【讨论】:

以上是关于如何连接多行?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取以多行值连接的 id 记录

如何从返回主键多行的连接中选择第一行

当多行满足要求时,如何通过连接在 PostgreSQL 中进行选择?

如何在 SQL Server 中将多行文本连接成单个文本字符串

在不创建存储过程的情况下,如何在 Oracle 中将多行连接成一行? [复制]

在 MySQL 中将多行连接成单行