許多實務應用時常需將群組特定字串組合成格式化字串(如CSV字串),如下表列出部門員工列表。
Dept
|
Emp_List
|
HR
|
Jane
|
IT
|
Andy,Kevin
|
MA
|
James,May
|
許多資料庫較新版本已提供字串彙總函數,如MySQLGROUP_CONCAT指令、ORACLE 11g之LISTAGG或MSSQL 2017之STRING_AGG函數。
資料庫
|
指令
|
MySQL
|
GROUP_CONCAT
|
ORACLE 11g
|
LISTAGG
|
MSSQL 2017
|
STRING_AGG
|
MSSQL2017以下版本,可採用ML PATH進行字串組合,由於指令稍稍繁雜且使用上並不簡便,但為內建功能而常被應用,但強烈建議以CLR建立User-Defined
Aggregate Functions。
SQL
|
|
方法1
|
SELECT DISTINCT E.Dept
, STUFF(
(
SELECT ',' + A.EmpName
FROM #Emp A
WHERE E.Dept = A.Dept
ORDER BY A.EmpName
FOR XML PATH('')
)
, 1, 1, ''
) AS Emp_List
FROM #Emp E
|
方法2
|
SELECT DISTINCT E.Dept
, SUBSTRING(EmpList, 1, LEN(EmpList)-1) EmpList
FROM #Emp E
CROSS APPLY
(
SELECT COALESCE(A.EmpName, '')
+ ','
FROM #Emp A
WHERE E.Dept = A.Dept
ORDER BY A.EmpName
FOR XML PATH('')
) X (EmpList)
*提醒: 此語法在2014版本中建立為VIEW時,發生1033錯誤,方法1則可。2016卻正常。 |
建立資料:
SELECT * INTO #Emp
FROM (VALUES('HR', 'Jane')
,('IT', 'Andy')
,('IT', 'Kevin')
,('MA', 'May')
,('MA', 'James')
) AS Emp(Dept, EmpName)
沒有留言:
張貼留言