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