在 SQL SERVER 中使用 FOR XML PATH 和 STUFF 将行值连接为逗号分隔的字符串

本文展示了如何在SQLSERVER中利用FORXMLPATH和STUFF函数将表中多行数据转换为单个查询中的逗号分隔字符串,以实现员工姓名和资格的聚合显示。通过创建和操作临时表,插入数据,然后进行特定查询,最终得到每个员工的资格以逗号分隔的格式。
摘要由CSDN通过智能技术生成

在 SQL SERVER 中使用 FOR XML PATH 和 STUFF 将行值连接为逗号分隔的字符串

简介:在本文中,将分享如何在 SQL SERVER 中使用 FOR XML PATH() 和 STUFF 将表中单个列的多个行值转换或连接为单个查询中的逗号分隔字符串。

实例:为了演示目的,让我们创建一些临时表和查询。

创建一个临时表来存储员工数据,并在该表中插入一些虚拟数据以用于演示目的

CREATE TABLE #tbEmployee 
(
  EmployeeId INT IDENTITY(1,1) PRIMARY KEY , 
  EmployeeName VARCHAR(50)
)

INSERT INTO #tbEmployee (EmployeeName) 
VALUES
('AMAN'), 
('RAMAN'),
('ANUJ'),
('KABEER'),
('AAMIR')

检查插入的数据
从#tbEmployee中选择*

在这里插入图片描述

使用 FOR XML PATH 和 STUFF 查询以逗号分隔的字符串形式获取所有员工。

SELECT STUFF((SELECT DISTINCT ‘, ’ + CAST(EmployeeName AS VARCHAR(100)) FROM #tbEmployee FOR XML PATH(’‘)),1,2,’') AS Employees

注意:这里我们使用 FOR XML PATH 将行值连接为逗号分隔的字符串,并使用 STUFF 命令获取第一个字符,在我们的例子中是逗号,并将其替换为空

所以查询结果将是:
在这里插入图片描述

现在让我们让这个例子更有用。假设需要以逗号分隔的形式显示所有员工及其资格。有多种方法可以获得所需的结果。其中一种方法是使用 FOR XML PATH。让我们通过示例了解如何获得所需的结果。

让我们创建一个主表来存储资格,并使用下面的脚本在其中插入一些资格。

CREATE TABLE #tbQualification  
(
 QualificationId INT IDENTITY(1,1) PRIMARY KEY ,
 QualificationName  VARCHAR(50)
)

INSERT INTO  #tbQualification (QualificationName) 
VALUES
('MCA'), 
('M.TECH'),
('B.TECH'),
('BCA'),
('MBA')

Check inserted qualifications
SELECT * FROM #tbQualification
Query result:

在这里插入图片描述
现在创建一个表来存储员工的资格。

CREATE TABLE #tbEmployeeQualifications 
(
  Id INT IDENTITY(1,1) PRIMARY KEY , 
  EmployeeId INT, 
  QualificationId INT
)

INSERT INTO  #tbEmployeeQualifications (EmployeeId,QualificationId) 
VALUES
(1,4),
(1,5),
(2,2), 
(2,3),
(3,4),
(3,1), 
(3,5),
(5,4);

查询以获取员工及其资格

SELECT E.EmployeeId,E.EmployeeName, Q.QualificationName FROM #tbEmployee E
LEFT OUTER JOIN #tbEmployeeQualifications EQ ON E.EmployeeId=EQ.EmployeeId

LEFT OUTER JOIN #tbQualification Q ON Q.QualificationId=EQ.QualificationId

Query Result:
在这里插入图片描述
正如我们所看到的,如果任何员工具有多种资格,则有多行。

但是假设我们想为每个具有多个资格的员工显示单个记录作为逗号分隔的字符串,那么我们可以将查询编写为:

查询以获取每个员工的多个资格作为逗号分隔的字符串:

SELECT E.EmployeeId,E.EmployeeName,
    STUFF
    (
        (
            SELECT ', ' + CAST(Q.QualificationName AS VARCHAR(50))
            FROM #tbEmployeeQualifications EQ
            LEFT OUTER JOIN #tbQualification Q ON Q.QualificationId=EQ.QualificationId
            WHERE EQ.EmployeeId = E.EmployeeId
            ORDER BY Q.QualificationName
            FOR XML PATH('')
        ), 1, 2, ''
    ) AS Qualifications
FROM
    #tbEmployee E

Query Result:
在这里插入图片描述

参考资源链接:[SQL Server去重合并行数据:逗号分隔实现方法](https://wenku.csdn.net/doc/6412b71cbe7fbd1778d491f6?utm_source=wenku_answer2doc_content) 处理SQL Server的重复行数据并合并为单行显示是数据处理常见的需求,特别是在数据分析和报告生成的过程。在你的表变量`@T1`,如果你想要将具有相同`CityName`的`UserName`合并成一个逗号分隔字符串,可以采用以下两种方法: 第一种方法使用 `FOR XML PATH` 和 `STUFF` 函数。这种方法会生成一个XML格式的字符串,然后利用 `STUFF` 函数处理字符串的开始部分,以移除第一个逗号。具体的SQL语句如下: ```sql SELECT CityName, STUFF((SELECT ',' + UserName FROM @T1 WHERE CityName = A.CityName FOR XML PATH('')), 1, 1, '') AS UserList FROM @T1 A GROUP BY CityName ``` 在这段SQL,我们首先通过 `FOR XML PATH('')` 将同一城市的用户名转换成一个连续的字符串,然后通过 `STUFF` 函数移除字符串的首字符逗号,最终实现逗号分隔的用户列表。 第二种方法是通过子查询和 `LEFT` 函数来合并用户名。首先,子查询生成一个每个城市对应的用户名列表,然后通过 `LEFT` 函数移除字符串的最后一个逗号。具体的SQL语句如下: ```sql SELECT B.CityName, LEFT(UserList, LEN(UserList) - 1) FROM ( SELECT CityName, (SELECT UserName + ',' FROM @T1 WHERE CityName = A.CityName FOR XML PATH('')) AS UserList FROM @T1 A GROUP BY CityName ) B ``` 在这个例子,子查询的 `FOR XML PATH('')` 创建了一个XML格式的字符串,而 `LEFT` 函数则用来移除这个字符串末尾的逗号。 通过上述两种方法,你可以根据具体的SQL Server版本和性能要求选择适合的方案来实现重复行数据的合并。这两种方法在《SQL Server去重合并行数据:逗号分隔实现方法》一文都有详细介绍,并提供了具体的使用场景和解释,旨在帮助你更深入地理解和掌握这一技能。 参考资源链接:[SQL Server去重合并行数据:逗号分隔实现方法](https://wenku.csdn.net/doc/6412b71cbe7fbd1778d491f6?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值