首页 >数据库 >mysql教程 >如何在 SQL Server 中使用 GROUP BY 将多个值连接成逗号分隔的字符串?

如何在 SQL Server 中使用 GROUP BY 将多个值连接成逗号分隔的字符串?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-10 17:37:45229浏览

How Can I Concatenate Multiple Values into a Comma-Separated String Using GROUP BY in SQL Server?

在 SQL Server 中使用逗号分隔的字符串聚合数据

SQL Server 的 GROUP BY 子句非常适合数据聚合。 但是如何将分组行中的多个值组合成一个以逗号分隔的字符串?

挑战:

想象一个这样的桌子:

<code>ID    ReportId     Email
1     1            a@domain.com
2     2            b@domain.com
3     1            c@domain.com
4     3            d@domain.com
5     3            e@domain.com</code>

目标是按 ReportId 进行分组,并将电子邮件连接到每个报告的逗号分隔列表中。

解决方案:子查询和 FOR XML PATH

以下是如何使用子查询和 FOR XML PATH 方法来实现此目的:

<code class="language-sql">SELECT ReportId, Email = 
    STUFF((SELECT ', ' + Email
           FROM table_name b 
           WHERE b.ReportId = a.ReportId 
          FOR XML PATH('')), 1, 2, '')
FROM table_name a
GROUP BY ReportId;</code>

说明:

  • 子查询: 内部 SELECT 语句检索与特定 ReportId 关联的所有电子邮件。
  • FOR XML PATH(''): 此函数将电子邮件结果转换为 XML 字符串,每封电子邮件作为一个单独的节点。 '' 确保不会创建父节点。
  • STUFF: STUFF 函数删除 SELECT 语句添加的前导逗号和空格,从而产生干净的逗号分隔字符串。

结果:

查询将产生以下输出:

<code>ReportId     Email
1            a@domain.com, c@domain.com
2            b@domain.com
3            d@domain.com, e@domain.com</code>

这有效地将多个电子邮件地址合并为每个 ReportId 的单个逗号分隔字符串。 虽然这种方法效果很好,但请考虑探索其他特定于数据库的函数,例如 STRING_AGG(在更高的 SQL Server 版本中可用),以获得可能更有效的解决方案。

以上是如何在 SQL Server 中使用 GROUP BY 将多个值连接成逗号分隔的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn