本篇文章主要介绍如何将多行数据拼接成单行数据,在实际开发中也经常会遇到这种需求。一般拼接字符串中要指定分割符,原文地址见:stackoverflow:how-to-concatenate-text-from-multiple-rows-into-a-single-text-string-in-sql-server。
原问题:
存储name信息的表中如三行数据,如:
Peter
Paul
Mary
如何将这三行数据显示为一行,显示的结果为:
Peter, Paul, Mary
采纳答案:
在SQL SERVER 2005版本可以通过XML PATH
的方式实现该效果。
表STUDENTS有如下数据:
SubjectID StudentName
---------- -------------
1 Mary
1 John
1 Sam
2 Alaina
2 Edward
期望的结果为
SubjectID StudentName
---------- -------------
1 Mary, John, Sam
2 Alaina, Edward
查询语句:
SELECT Main.SubjectID,
LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
(
SELECT DISTINCT ST2.SubjectID,
(
SELECT ST1.StudentName + ',' AS [text()]
FROM dbo.Students ST1
WHERE ST1.SubjectID = ST2.SubjectID
ORDER BY ST1.SubjectID
FOR XML PATH (''), TYPE
).value('text()[1]','nvarchar(max)') [Students]
FROM dbo.Students ST2
) [Main]

还有更简洁的方式,可以通过将’,’放在前面进行拼接,然后在使用substring的方式进行截取(示例中截取了2至1000,如果实际长度超过会带来一些问题):
SELECT DISTINCT ST2.SubjectID,
SUBSTRING(
(
SELECT ','+ST1.StudentName AS [text()]
FROM dbo.Students ST1
WHERE ST1.SubjectID = ST2.SubjectID
ORDER BY ST1.SubjectID
FOR XML PATH (''), TYPE
).value('text()[1]','nvarchar(max)'), 2, 1000) [Students]
FROM dbo.Students ST2

其他优质答案:
SQL Server 2017及后续版本提供了STRING_AGG函数,相对于XML的方式更加简洁。如果是使用其他版本的数据库可以查询下官方文档是否有相关函数,像Posgtresql就实现这个了函数,打开链接,搜索string_agg关键字就能找到。
STRING_AGG使用示例:
不使用grouping:
SELECT STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department;

使用grouping:
SELECT GroupName, STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department
GROUP BY GroupName;

使用grouping和sub-sorting(实现了排序效果)
SELECT GroupName, STRING_AGG(Name, ', ') WITHIN GROUP (ORDER BY Name ASC) AS Departments
FROM HumanResources.Department
GROUP BY GroupName;

本文根据StackOverflow翻译而来,不代表烟海拾贝立场,如若转载,请注明出处:https://somirror.com/617.html