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

比如表中有两列数据 :

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的另一列的多行内容拼接成一行

 

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

上一篇:MySql实现远程连接


下一篇:Oracle 实现 mysql 更新 update limit