数据准备
假设表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