我使用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
我尝试了分组依据,但是我发现分组依据无法做到这一点。
我该怎么办?
答案 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;