SQL Server将类别的相同数据放在一起

时间:2019-05-16 02:05:52

标签: sql sql-server sql-server-2008

我使用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

我想根据第一列和第三列分开数据。

如果第一列(leaderCD)和第三列(消息)具有相同的数据,则将第二列合并在一起,使用分号,就像这样:

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

我尝试了分组依据,但是我发现分组依据无法做到这一点。

我该怎么办?

2 个答案:

答案 0 :(得分:2)

我不确定您是否对这个问题进行了足够的研究,但是我为您提供了一个潜在的解决方案。这是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和消息匹配时将其重新连接到主表。我们可以在此处利用选择的独特字符来防止重复,但是由于我们构建字符串的方式,我认为这不是必需的。 对于XML Path,它是另一段代码,基本上根据您的查询结果创建一个XML文件,在这种情况下,我们使用它的方式是没有创建路径(因此为空字符串),您可以阅读有关的更多信息。 here。希望对您有所帮助,如果还有其他问题,请告诉我。

答案 1 :(得分:1)

如果您使用的是SQL Server 2017,请尝试以下操作:

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

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