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
大功告成
參考資料: