在 SQL Server 2012 中使用带有临时表的 XML 路径?

问题描述 投票:0回答:1

我使用的是 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 吉姆,比利
sql sql-server xml sql-server-2012
1个回答
0
投票

您需要先进行一些分组:

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,因此值始终以相同的方式排序

© www.soinside.com 2019 - 2024. All rights reserved.