SQL Server将相同id的另一列的多行内容拼接成一行

时间:2022-11-29 10:24:23

比如表中有两列数据 :

id name

1 a

1 b

1 c

2 d

2 e


变成如下格式:

id name

1 a,b,c

2 d,e

数据:

if object_id(#表)is not null drop table #表
select did,name, from #表 order by did
drop table #表
select 66 nid,'aaa' name,1 did into #表 union all
select 67,'bbb',1 union all
select 80,'ccc',1 union all
select 69,'ddd',2 union all
select 70,'eee',2

 

实现代码如下:

--递归计算多行合并成一个字段
--方法1
;with x (did, cnt, list, nid, le)
as (
select did,count(1)over(partition by did),cast(name as varchar(100))
,nid,1 from #表
union all
select x.did,x.cnt,cast(x.list+','+a.name as varchar(100)),a.nid,x.le+1 from #表 a,x
where a.did=x.did and a.nid>x.nid
)
select * from  x
where le=cnt


--方法2 中间表效率不好
if object_id(#表)is not null drop table #结果

select did,cast(name as varchar(2000)) name 
into #结果
from #表 
order by did

declare @dept int ='',@name varchar(max) =''
update a
set @name= case when @dept=did then @name+','+name
            else name
            end,
    @dept=did,
    name=@name
from #结果 a
select did,max(name) from #结果
group by did


--方法3 使用xml方便,简单
--select ',' + name from #表   for xml path('')
select did, name = (stuff((select ',' + name from #表 where did =   
a.did for xml path('')),1,1,'')) from #表 a group by did  

结果:

SQL Server将相同id的另一列的多行内容拼接成一行