SqlServer多行合并为一行,用逗号隔开

数据准备

假设表Work有三个列分别ID,Name,Post(ID、名字、职位)

===========================
ID       Name       Post
1          张三      项目经理
2          李四      前端工程师
3          王五      GIS开发工程师
3          赵六      GIS开发工程师

一、声明变量

1.将Work表Name字段,合并成一行 :张三,李四,王五,赵六

DECLARE @listStr VARCHAR(MAX);
SELECT @listStr = ISNULL(@listStr+',','')+ Name
FROM Work
SELECT @listStr

二、使用for xml path('') 和stuff

1.将Work表中Name字段信息合并成一行,以逗号隔开 :张三,李四,王五,赵六

  SELECT ',' + Name 
   FROM Work for xml path('')

2.将Work表中职位相同的名字,合并成一行,以逗号隔开 :

项目经理 张三
前端工程师 李四
GIS开发工程师 王五,赵六

select post,
name=STUFF((SELECT ','+work FROM Work t WHERE post=t1.post  FOR XML PATH('')), 1, 1, '') 
from Work 
GROUP BY post

三、使用字符串函数 STRING_AGG,这个函数是SQLSERVER 2017 版本之后才有的

SELECT STRING_AGG(ISNULL(Name,'N/A'), ',')  FROM Work

补充

如:将某张表的所有字段合并为一行,以逗号隔开: ID,Name,Post

SELECT name FROM SYSCOLUMNS WHERE ID=OBJECT_ID('DCTB') --查询某表的字段

DECLARE @listStr VARCHAR(MAX);
SELECT @listStr = ISNULL(@listStr+',','')+ name
FROM SYSCOLUMNS WHERE ID=OBJECT_ID('DCTB')  order by colorder
SELECT @listStr

select id,
name=STUFF((SELECT ','+name FROM SYSCOLUMNS t WHERE ID=OBJECT_ID('Work') order by colorder FOR XML PATH('')), 1, 1, '')  
from SYSCOLUMNS
WHERE ID=OBJECT_ID('Work')
GROUP BY id

参考资料:https://www.cnblogs.com/bdqczhl/p/11665818.html

sql 
更新时间:2020-08-13 10:45:19

本文由 清水河恶霸 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:http://ql.magic-seven.top/2020/08/13/sqlserver多行合并为一行用逗号隔开.html
最后更新:2020-08-13 10:45:19

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×