【问题标题】: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?stackoverflow.com/questions/3087684/… @Martin 的可能重复项,最后一个有一个更好的例子,可以在“GROUP BY”中使用它。还有一个使用自定义 CLR 聚合的选项。
  • 也许我在这里遗漏了一些东西,但是你从哪里获得额外的数据?
  • SqlServer 2017 现在有 STRING_AGG,它使用给定的分隔符将多个字符串聚合为一个。 (不允许发布重复问题的重复答案。)

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


【解决方案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。有一种很好的方法来处理这个问题,请参阅:stackoverflow.com/questions/5031204/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2018-09-23
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2017-05-31
    相关资源
    最近更新 更多