You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中基于员工ID生成对应地区的逗号分隔字符串?

如何在SQL中按员工分组生成逗号分隔的工作地点字符串?

涉及的数据表

EmployeeWorkLocations表

查询语句:

select * from [dbo].[EmployeeWorkLocations] order by employeeid

对应数据:

WLId    EmployeeId  WLStateId
28      1           2
29      1           1
30      1           3
73      1           3
81      2           1
82      2           2
67      2           2
69      2           3
70      2           2
5       5           1
6       5           2
7       5           3
91      6           1
92      6           2
83      6           1
90      6           2
88      6           2
26      6           3
93      7           1
94      7           2
95      7           4
27      8           3

WorkLocation表

查询语句:

select * from [dbo].[WorkLocation]

对应数据:

Id  State
1   Delhi
2   Orissa
3   Mumbai
4   Pune

期望输出

按员工ID分组,将每个员工的工作地点按原始记录顺序拼接成逗号分隔的字符串:

EmployeeId  State
1           Orissa, Delhi, Mumbai, Mumbai
2           Delhi, Orissa, Orissa, Mumbai, Orissa
5           Delhi, Orissa, Mumbai
6           Delhi, Orissa, Delhi, Orissa, Orissa, Mumbai
7           Delhi, Orissa, Pune
8           Mumbai

实现方案

方案一:SQL Server 2017及更高版本(使用STRING_AGG函数)

SQL Server 2017及以上版本提供了专门的字符串聚合函数STRING_AGG,写法简洁直观:

SELECT
    ewl.EmployeeId,
    STRING_AGG(wl.State, ', ') WITHIN GROUP (ORDER BY ewl.WLId) AS State
FROM [dbo].[EmployeeWorkLocations] ewl
INNER JOIN [dbo].[WorkLocation] wl ON ewl.WLStateId = wl.Id
GROUP BY ewl.EmployeeId
ORDER BY ewl.EmployeeId;

通过WITHIN GROUP (ORDER BY ewl.WLId)保证拼接顺序和原始表中每个员工的记录顺序一致,匹配期望输出的排序要求。

方案二:SQL Server 2016及更早版本(使用STUFF+FOR XML PATH)

针对旧版本SQL Server,可通过FOR XML PATH拼接字符串,再用STUFF去除开头多余的分隔符:

SELECT
    DISTINCT ewl.EmployeeId,
    STUFF(
        (SELECT ', ' + wl.State
         FROM [dbo].[EmployeeWorkLocations] ewl2
         INNER JOIN [dbo].[WorkLocation] wl ON ewl2.WLStateId = wl.Id
         WHERE ewl2.EmployeeId = ewl.EmployeeId
         ORDER BY ewl2.WLId
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
        1, 2, ''
    ) AS State
FROM [dbo].[EmployeeWorkLocations] ewl
ORDER BY ewl.EmployeeId;

子查询中FOR XML PATH('')会把每个员工的工作地点拼接成类似, Orissa, Delhi的字符串,STUFF(..., 1, 2, '')去掉开头的, 得到干净结果,同样通过ORDER BY ewl2.WLId保证顺序正确。

内容的提问来源于stack exchange,提问作者Navin Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:57:39