SQL SERVER中将多行数据拼接成单行数据

本篇文章主要介绍如何将多行数据拼接成单行数据,在实际开发中也经常会遇到这种需求。一般拼接字符串中要指定分割符,原文地址见: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]
xml path
SQL SERVER XML PATH

还有更简洁的方式,可以通过将’,’放在前面进行拼接,然后在使用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中将多行数据拼接成单行数据
SQL SErVER substring

执行SQL语句验证结果

其他优质答案:

SQL Server 2017及后续版本提供了STRING_AGG函数,相对于XML的方式更加简洁。如果是使用其他版本的数据库可以查询下官方文档是否有相关函数,像Posgtresql就实现这个了函数,打开链接,搜索string_agg关键字就能找到。

STRING_AGG使用示例:

不使用grouping:

SELECT STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department;
string_agg
string_agg

使用grouping:

SELECT GroupName, STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department
GROUP BY GroupName;
string_agg with grouping
string_agg with grouping

使用grouping和sub-sorting(实现了排序效果)

SELECT GroupName, STRING_AGG(Name, ', ') WITHIN GROUP (ORDER BY Name ASC) AS Departments
FROM HumanResources.Department
GROUP BY GroupName;
string_agg with grouping sub-sort
string_agg grouping sub-sorting

执行SQL语句验证结果

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

(0)
上一篇 2022-02-25 21:20
下一篇 2022-02-26 19:27

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注