员工角色的连续行

Posted

技术标签:

【中文标题】员工角色的连续行【英文标题】:Concat rows for employee roles 【发布时间】:2020-02-08 07:05:16 【问题描述】:

我正在使用 SQL Server。寻找与其他数据库中提供的 GROUP_CONCATlistagg 函数类似的功能。似乎为连接行提供了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 GROUPSTRING_AGG中的用法

以上是关于员工角色的连续行的主要内容,如果未能解决你的问题,请参考以下文章

全国排名的问题(linq 的连表查询 等同于sql的left join)

聚合 SQL 中的连续行

每个客户的连续行之间的Haversine距离

基于正则表达式连接熊猫中的连续行

SQL 查询 - 计算值大于 X 的连续行数

在具有特定值的连续行上定义一个窗口