sql实现把多行合并为一列

分类:DataBase
2020-10-19 16:02 阅读(?)评论(0)
实现过程的完整SQL如下,然后一步步看执行结果。
搜狐微博上传图片有问题,这里直接复制数据库执行的文本结果。
create table #tmp
(
EmpNo varchar(20) not null,        --员工编号
PrjNo varchar(20) not null        --员工所属项目类型
)
 
insert into #tmp
values
('1001', 'A'),
('1001', 'B'),
('1002', 'B')

select * from #tmp
表查询结果如下:
EmpNo    PrjNo
1001    A
1001    B
1002    B

select * from #tmp for xml path   
for xml path将查询结果以XML格式显示。结果如下:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
<row><EmpNo>1001</EmpNo><PrjNo>A</PrjNo></row><row><EmpNo>1001</EmpNo><PrjNo>B</PrjNo></row><row><EmpNo>1002</EmpNo><PrjNo>B</PrjNo></row>

select * from #tmp for xml path('')
for xml path('')比for xml path(),显示更简单,去掉了<row>节点。结果如下:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
<EmpNo>1001</EmpNo><PrjNo>A</PrjNo><EmpNo>1001</EmpNo><PrjNo>B</PrjNo><EmpNo>1002</EmpNo><PrjNo>B</PrjNo>

select ',' + PrjNo from #tmp for xml path('')
对列进行“+”运算后,不以XML格式显示了,只有节点内容。结果如下:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
,A,B,B

select EmpNo, ',' + PrjNo from #tmp for xml path('')
多加一列后,又以XML格式显示,计算列没有指定列名。结果如下:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
<EmpNo>1001</EmpNo>,A<EmpNo>1001</EmpNo>,B<EmpNo>1002</EmpNo>,B

SELECT EmpNo, STUFF(
    (
        SELECT ',' + PrjNo
        FROM #tmp
        WHERE EmpNo = T.EmpNo FOR XML PATH('')
    ), 1, 1, '') AS PrjNoJoin
FROM #tmp AS T
STUFF函数删除 for xml path('')处理后多余的逗号“,”。结果如下:
EmpNo    PrjNoJoin
1001    A,B
1001    A,B
1002    B

SELECT DISTINCT EmpNo, STUFF(
    (
        SELECT ',' + PrjNo
        FROM #tmp
        WHERE EmpNo = T.EmpNo FOR XML PATH('')
    ), 1, 1, '') AS PrjNoJoin
FROM #tmp AS T
最后对数据去重。结果如下图:
EmpNo    PrjNoJoin
1001    A,B
1002    B
  最后修改于 2020-10-19 17:01    阅读(?)评论(0)
 
表  情:
加载中...
 

请各位遵纪守法并注意语言文明