T-SQL筆記12_如何透過for xml path 搭配STUFF將多ROW資料合併同一ROW

 
透過for xml path 搭配STUFF將多ROW資料合併同一ROW

首先產生測試用的資料

SQL:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (1, N'Lisa') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (2, N'Fanny') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (2, N'Doris') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (3, N'Kiki') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (3, N'John') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (1, N'Lily') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (1, N'Matt') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (3, N'Tina') 

INSERT [TEAMLIST] ([team_id], [emp_name])  
VALUES (1, N'Andy') 



以下是我們的測試資料
團隊編號對應員工名字




SQL:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
select emp_name from TEAMLIST where team_id=1 
for xml path('')
--<emp_name>Lisa</emp_name><emp_name>Lily</emp_name><emp_name>Matt</emp_name><emp_name>Andy</emp_name>
select ','+emp_name from TEAMLIST where team_id=1 
for xml path('')
--,Lisa,Lily,Matt,Andy
select emp_name+',' from TEAMLIST where team_id=1 
for xml path('')
--Lisa,Lily,Matt,Andy,

select ','+emp_name from TEAMLIST for xml path('')
--,Lisa,Fanny,Doris,Kiki,John,Lily,Matt,Tina,Andy


預設的for xml path 會直接將對應該column下所有的row值變成一串By該欄位名稱的XML字串



在欄位串接特定字元 (這裡用逗號)
就會替換成用該字元join起來

這裡改一下SQL來達成功能需求要的
顯示團隊ID跟相應的員工名稱列表(同團隊ID的要將員工名稱合併為同一列)

SQL:

1
2
3
4
5
6
select distinct team_id , (
	select ',' + emp_name from TEAMLIST as inner_list
	where inner_list.team_id = outer_list.team_id 
	for xml path('')
) as team_members
from TEAMLIST as outer_list



看起來仍有稍稍美中不足 前面多出逗號
此時用
STUFF(原字串, 起始位置, 移除長度, 替換字串)
來修飾

SQL:

1
2
3
4
5
6
select distinct team_id ,STUFF((
	select ',' + emp_name from TEAMLIST as inner_list
	where inner_list.team_id = outer_list.team_id 
	for xml path('')
),1,1,'') as team_members
from TEAMLIST as outer_list




完工~






Ref:
[SQL]將多筆資料合併為一筆顯示(FOR XML PATH)

MS SQL-字串函數-STUFF

使用FOR XML PATH將多筆資料組合成一個字串

[食譜好菜] SQL Server 使用「FOR XML」語法做欄位合併

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header