前段時間寫了個帖子,主題爲使用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 |