iT邦幫忙

1

[SQL Server] 使用FOR XML PATH合併多筆資料

  • 分享至 

  • xImage
  •  

官方文件關於FOR XML PATH的說明是:可以 XML 格式擷取 SQL 查詢的正式結果。
不論是以上的說明,或是文件列舉的資料,其實我不太清楚這個功能要如何使用,
直到實務上遇到需要從DB產出資料的需求後,才對FOR XML PATH有初步的了解。

範例

原始報表資料如下:
https://ithelp.ithome.com.tw/upload/images/20230309/20149099Pi78hyfBpy.png

可以看到有多筆關於user的欄位值都是重複的,
但因為ProjectName欄位值不同的緣故,
資料被分割成多筆,這在資料管理上是沒有問題的,
但如果需要將資料以報表等方式呈現時,會偏好讓ProjectName合併在一起,
一名人員只需要顯示一筆資料即可,這時候FOR XML PATH就派上用場了~

首先,使用for XML Path('')針對ProjectName去做合併,
每一筆ProjectName的資料用逗號分隔:

SELECT T1.UnitName, T1.Account, T1.UserName,
(
  SELECT ',' + T2.ProjectName 
  FROM Users T2
  WHERE T1.UnitName = T2.UnitName and T1.Account = T2.Account and T1.UserName = T2.UserName
  for XML Path('')
) AS ProjectName
 FROM Users T1

可以看到ProjectName被合併了,但有資料重複,
以及ProjectName最前方多出一個逗號的問題:
https://ithelp.ithome.com.tw/upload/images/20230309/20149099ibpN23esOj.png

使用DISTINCT移除重複資料,並用STUFFProjectName最前方的逗號移除:

SELECT DISTINCT T1.UnitName, T1.Account, T1.UserName,
STUFF((
  SELECT ',' + T2.ProjectName 
  FROM Users T2
  WHERE T1.UnitName = T2.UnitName and T1.Account = T2.Account and T1.UserName = T2.UserName
  for XML Path('')
 ), 1, 1, '') AS ProjectName
FROM Users T1

最終資料如下:
https://ithelp.ithome.com.tw/upload/images/20230309/20149099nDrPxgo4e4.png


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言