I’m using SQL Server. Looking for similar functionality as GROUP_CONCAT or listagg functions provided in other Databases. Seems like STUFF function is provided to concat rows. Here’s my attempt.
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;
Employee
+----+-------+------+ | Id | First | Last | +----+-------+------+ | 1 | John | Doe | | 2 | Jane | Doe | +----+-------+------+
Role
+----+-------+ | Id | Name | +----+-------+ | 1 | Role1 | | 2 | Role2 | | 3 | Role3 | | 4 | Role4 | +----+-------+
EmployeeRole
+------------+--------+ | EmployeeId | RoleId | +------------+--------+ | 1 | 1 | | 1 | 2 | | 2 | 2 | | 2 | 3 | | 2 | 4 | +------------+--------+
Expected Output
+------------+-------+---------+-------------------+ | EmployeeId | First | RoleIds | RoleNames | +------------+-------+---------+-------------------+ | 1 | John | 1,2 | Role1,Role2 | | 2 | Jane | 2,3,4 | Role2,Role3,Role4 | +------------+-------+---------+-------------------+
Advertisement
Answer
In SQLServer 2017, you can use aggregate function 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;
Note: table aliases make the query more concise and easier to read. I modified the query to use them.