2018年1月18日 星期四

[MSSQL] 字串彙總(CSV String)

許多實務應用時常需將群組特定字串組合成格式化字串(CSV字串),如下表列出部門員工列表。
Dept
Emp_List
HR
Jane
IT
Andy,Kevin
MA
James,May

許多資料庫較新版本已提供字串彙總函數,如MySQLGROUP_CONCAT指令、ORACLE 11gLISTAGGMSSQL 2017STRING_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)

沒有留言:

張貼留言