T-SQL 打造仿 MySQL 的 group_concat 函數

 

本文章只是根據使用 MSSQL 打造仿 MySQL 的group_concat 函数的山寨版之文章,

所寫的自我學習心得而己。

 

一、準備測試資料

create table #tmp (id int identity(1,1),empname varchar(10),item nvarchar(100))
 
insert into #tmp(empname,item) values ('car','fit')
insert into #tmp(empname,item) values ('car','bmw x7')
insert into #tmp(empname,item) values ('car','prius c')
insert into #tmp(empname,item) values ('fruit','apple')
insert into #tmp(empname,item) values ('fruit','banana')
insert into #tmp(empname,item) values ('liquid','water')
insert into #tmp(empname,item) values ('liquid','rain')

 

二、使用  「for xml path」來做成 xml 格式,但其另有目的是將其黏成一字串

select item from #tmp for xml path('')

 

三、使用「,」號來刪掉左右兩邊的 Tag

為什麼這樣做就可以刪掉左右兩邊的 Tag?I don't know,我也覺得很神奇。

select ',' + item from #tmp for xml path('')

 

四、針對每筆資料做出屬於某類的相黏字串

SELECT b.empname,
       (SELECT ',' + item
        FROM   #tmp a
        WHERE  a.empname = b.empname
        FOR xml path('')) item
FROM   #tmp b 

 

五、最後使用 group by 來做出符合 group_concat 目的之資料出來

SELECT b.empname,
       (SELECT ',' + item
        FROM   #tmp a
        WHERE  a.empname = b.empname
        FOR xml path('')) item
FROM   #tmp b
GROUP  BY empname 

 

六、利用 stuff 涵數來把最左邊的逗號去掉

SELECT b.empname,
       Stuff((SELECT ',' + item
              FROM   #tmp a
              WHERE  a.empname = b.empname
              FOR xml path('')), 1, 1, '') item
FROM   #tmp b
GROUP  BY empname 

大功告成

 

參考資料:

使用 MSSQL 打造仿 MySQL 的group_concat 函数的山寨版