我使用的是 2012 版本,需要使用 XLM 路径来获取类似项目的通用分隔字符串。我有一个已编译的临时表,希望根据项目编号组合人员。结果将所有人员合并到所有项目的一个列表中。我希望了解具体的项目。
select #Team.WBS1,
stuff((
Select ',', #Team.Team as [text()]
from #Team
Where #team.WBS1 = #team.wbs1
for xml path('')
), 1, 1, '')
from #Team
我对每个项目编号都得到相同的结果。
项目 | 人 |
---|---|
1 | 约翰、吉姆、肖恩、比利 |
1 | 约翰、吉姆、肖恩、比利 |
1 | 约翰、吉姆、肖恩、比利 |
1 | 约翰、吉姆、肖恩、比利 |
2 | 约翰、吉姆、肖恩、比利 |
3 | 约翰、吉姆、肖恩、比利 |
3 | 约翰、吉姆、肖恩、比利 |
4 | 约翰、吉姆、肖恩、比利 |
4 | 约翰、吉姆、肖恩、比利 |
我需要这样的结果
项目 | 人 |
---|---|
1 | 约翰、吉姆、肖恩、比利 |
2 | 比利 |
3 | 吉姆,肖恩, |
4 | 约翰、吉姆、比利 |
数据看起来像这样
项目 | 人 |
---|---|
1 | 约翰 |
1 | 吉姆 |
1 | 肖恩 |
1 | 比利 |
2 | 比利 |
3 | 吉姆 |
3 | 肖恩 |
4 | 约翰 |
4 | 吉姆,比利 |
您需要先进行一些分组:
WITH data AS (
SELECT *
FROM (
VALUES (1, N'john')
, (1, N'jim')
, (1, N'sean')
, (1, N'billy')
, (2, N'billy')
, (3, N'jim')
, (3, N'sean')
, (4, N'john')
, (4, N'jim, billy')
) t (Project,People)
)
SELECT Project
, STUFF((
SELECT ',' + People
FROM data dInner
WHERE dInner.Project = d.Project
FOR xml path(''), type
).value('text()[1]', 'NVARCHAR(MAX)'), 1, 1, '') AS People
FROM data d
GROUP BY project
并将子查询表与主查询表“连接”。
实际上,我的建议是始终对表使用别名,这可以避免由于不正确的 JOIN 导致的许多错误。
输出:
项目 | 人 |
---|---|
1 | 约翰、吉姆、肖恩、比利 |
2 | 比利 |
3 | 吉姆,肖恩 |
4 | 约翰、吉姆、比利 |
一个小旁注是,在执行 FOR XML 操作时最好使用 ORDER BY,因此值始终以相同的方式排序