SQL服务器把相同类别的数据放在一起

SQL Server put the same data of category together

我用SQL来模拟类似类别的数据:

select TA.leaderCD, TA.EmpCD, TA.message
from  
    (select '1001' as EmpCD, 'L001' as leaderCD,'M1' as message
     union 
     select '1001','L002','M1'
     union 
     select '1001', 'L003','M1'
     union 
     select '1002', 'L001','M1'
     union 
     select '1002', 'L002','M2'
     union 
     select '1002', 'L004','M2'
     union 
     select '1003', 'L002','M1'
     union 
     select '1003', 'L003','M1'
     union 
     select '1003', 'L005','M2'
     union 
     select '1004', 'L002','M1'
     union 
     select '1004', 'L003','M2'
     union 
     select '1004', 'L004','M2'
     union 
     select '1004', 'L005','M3') as TA
order by 
    TA.leaderCD

结果是:

leaderCD EmpCD  message
L001     1001   M1
L001     1002   M1
L002     1001   M1
L002     1002   M2
L002     1003   M1
L002     1004   M1
L003     1001   M1
L003     1003   M1
L003     1004   M2
L004     1002   M2
L004     1004   M2
L005     1003   M2
L005     1004   M3

我想把数据按照第1列和第3列分开

如果第1列(leaderCD)和第3列(message)的数据相同,将第2列合并,使用分号,就像这样:

leaderCD EmpALL         message
L001     1001;1002      M1
L002     1001;1003;1004 M1
L002     1002           M2
L003     1001;1003      M1
L003     1004           M2
L004     1002;1004      M2
L005     1003           M2
L005     1004           M3

我试过分组,但我发现分组不能这样做。

我该怎么办?

我不确定您是否对这个问题做了足够的研究,但我已经为您提供了一个可能的解决方案。这里是SQLFiddle。代码如下:

SELECT EE.LeaderCD AS [Leader], EE.Message AS [Message], 
STUFF((SELECT ', ' + EmpCD 
       FROM Employees e 
       WHERE e.LeaderCD = ee.LeaderCD AND e.Message = ee.Message
       FOR XML PATH('')), 1, 1, '') AS [Employees]
FROM Employees ee
GROUP BY ee.LeaderCD, ee.Message

希望这段代码的工作方式简单明了。 STUFF 是一个 SQL 函数,基本上,它允许您用指定的开始和结束替换字符串中的文本。这是创建一个逗号分隔的列表(您可以在 here 上看到更多信息),然后在员工 ID 和消息匹配时将其加入主列表 table。我们可以在此处使用 select distinct 来防止重复,但由于我们构建字符串的方式,我认为这不是必需的。 对于 XML Path 是一段不同的代码,它基本上根据您的查询结果创建一个 XML 文件,在这种情况下我们使用它的方式没有创建路径(因此空白字符串) -- 您可以阅读更多相关内容 here。我希望这会有所帮助,如果您有任何其他问题,请告诉我。

如果您使用的是 SQL Server 2017,试试这个:

SELECT
    leadercd
    ,message
    ,STRING_AGG(empcd, ', ') AS e
FROM
    t
GROUP BY
    leadercd,message;

http://sqlfiddle.com/#!18/56434/17