员工角色的连续行
Posted
技术标签:
【中文标题】员工角色的连续行【英文标题】:Concat rows for employee roles 【发布时间】:2020-02-08 07:05:16 【问题描述】:我正在使用 SQL Server。寻找与其他数据库中提供的 GROUP_CONCAT
或 listagg
函数类似的功能。似乎为连接行提供了STUFF
函数。这是我的尝试。
SELECT Employee.Id, Employee.First,
STUFF((
SELECT '' + Role.Id
FROM Role
WHERE EmployeeRole.RoleId = Role.Id
FOR XML PATH('')), 1, 0, '') AS RoleIds,
From Employee
INNER JOIN EmployeeRole ON Employee.Id = EmployeeRole.EmployeeId
INNER JOIN Role ON EmployeeRole.RoleId = Role.Id
ORDER BY Employee.Id;
员工
+----+-------+------+
| Id | First | Last |
+----+-------+------+
| 1 | John | Doe |
| 2 | Jane | Doe |
+----+-------+------+
角色
+----+-------+
| Id | Name |
+----+-------+
| 1 | Role1 |
| 2 | Role2 |
| 3 | Role3 |
| 4 | Role4 |
+----+-------+
员工角色
+------------+--------+
| EmployeeId | RoleId |
+------------+--------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 2 | 3 |
| 2 | 4 |
+------------+--------+
预期输出
+------------+-------+---------+-------------------+
| EmployeeId | First | RoleIds | RoleNames |
+------------+-------+---------+-------------------+
| 1 | John | 1,2 | Role1,Role2 |
| 2 | Jane | 2,3,4 | Role2,Role3,Role4 |
+------------+-------+---------+-------------------+
【问题讨论】:
你使用的是哪个版本的sql-server?mssql-server-linux:2017
,基于linux运行在docker容器上。
对于 SQL Server 2017 有 string_agg()
: docs.microsoft.com/en-us/sql/t-sql/functions/…
我在使用 string_agg
时遇到了问题,因为我在选择中还有其他列
【参考方案1】:
在SQLServer 2017中,可以使用聚合函数STRING_AGG()
:
SELECT
e.Id EmployeeId,
e.First,
STRING_AGG(r.Id, ',') WITHIN GROUP(ORDER BY r.Id) RoleIds,
STRING_AGG(r.Name, ',') WITHIN GROUP(ORDER BY r.Id) RoleNames
FROM Employee e
INNER JOIN EmployeeRole er ON e.Id = er.EmployeeId
INNER JOIN Role r ON er.RoleId = r.Id
GROUP BY e.Id, e.First
ORDER BY e.Id;
注意:表别名使查询更简洁,更易于阅读。我修改了查询以使用它们。
【讨论】:
你能解释一下WITHIN GROUP
在STRING_AGG
中的用法以上是关于员工角色的连续行的主要内容,如果未能解决你的问题,请参考以下文章