将多个 SQL 行聚合到单个逗号分隔列中
本文演示了如何将共享公共标识符的多行合并为一行,并在特定列中使用逗号分隔的列表。 该示例使用包含工单 ID 和关联个人的表,旨在创建一个结果,其中每个工单 ID 都链接到所有相关个人的列表。
SQL Server 方法(2005 及更高版本)
以下 SQL Server 查询使用 STUFF()
、ISNULL()
和 FOR XML PATH
实现此目的:
<code class="language-sql">SELECT t.TicketID, STUFF(ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma], ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty] FROM @Tickets t GROUP BY t.TicketID</code>
此查询使用子查询来收集与每个 TicketID
关联的个体。 FOR XML PATH
方法将结果转换为连接字符串,并且 STUFF()
删除所有前导逗号。 ISNULL()
函数处理没有个人与票证关联的情况。 可选列提供了处理前导逗号的灵活性。
Oracle 解决方案
Oracle 使用 LISTAGG()
函数提供了更简洁的解决方案:
<code class="language-sql">SELECT TicketID, LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People FROM @Tickets</code>
LISTAGG()
直接将值聚合到以逗号分隔的列表中,并按 Person
列排序。 PARTITION BY
子句确保每个不同的 TicketID
发生聚合。 此方法比 SQL Server 等效方法更简单、更高效。
以上是如何在 SQL Server 和 Oracle 中将多行连接成逗号分隔的列表?的详细内容。更多信息请关注PHP中文网其他相关文章!