字段拼接二:使用轉置

前段時間寫了個帖子,主題爲使用FOR XML PATH實現字段拼接,傳送門如下:http://blog.csdn.net/weixin_38357227/article/details/78460857

最近看書學習時,發現另一種實現字段拼接的方法,即利用轉置。
表結構如下:

declare @s table(groupid varchar(10) not null,
memberid int not null,
string varchar(10) not null,
val int not null,
primary key(groupid,memberid)
)
insert into @s(groupid ,memberid,string,val) values
('a',3,'stra1',6),
('a',9,'stra2',7),
('b',2,'strb1',3),
('b',4,'strb2',7),
('b',5,'strb3',3),
('b',9,'strb4',11),
('c',3,'strc1',8),
('c',7,'strc2',10),
('c',9,'strc3',12)
groupid memberid string val
a 3 stra1 6
a 9 stra2 7
b 2 strb1 3
b 4 strb2 7
b 5 strb3 3
b 9 strb4 11
c 3 strc1 8
c 7 strc2 10
c 9 strc3 12

groupid memberid string val
a 3 stra1 6
a 9 stra2 7
b 2 strb1 3
b 4 strb2 7
b 5 strb3 3
b 9 strb4 11
c 3 strc1 8
c 7 strc2 10
c 9 strc3 12
首先要對參與聚合計算的值進行旋轉,當他們全部位於同一列時,就可以在各列之間進行線性運算。注意,除非組中有一列包含序列值,否則需要先計算出行號,以標識元素在組中的位置。

select *
 from (select groupid,string,row_number() over(partition by groupid order by memberid ) as rn
from @s) as d pivot(max(string) for rn in  ([1],[2],[3],[4])) as p 

結果如下:

groupid 1 2 3 4
a stra1 stra2 NULL NULL
b strb1 strb2 strb3 strb4
c strc1 strc2 strc3 NULL

進行字符串連接:

select groupid,[1]+coalesce(','+[2],'')+
coalesce(','+[3],'') +
coalesce(','+[4],'')  as string
 from (select groupid,string,row_number() over(partition by groupid order by memberid ) as rn
from @s) as d pivot(max(string) for rn in  ([1],[2],[3],[4])) as p 
groupid string
a stra1,stra2
b strb1,strb2,strb3,strb4
c strc1,strc2,strc3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章