SQLServerでレコードの値をカンマ区切りに変換する

SQLServerでレコードの値をカンマ区切りに変換する方法について紹介します。

コーディング例

BEGIN
    -- テストテーブルの作成
    CREATE TABLE #Test(
         Code        INT
        ,[Name]        VARCHAR(10)
        ,GroupNo    INT
    )
    INSERT INTO #Test
    VALUES (1, 'AAA', 1)
          ,(2, 'BBB', 1)
          ,(3, 'CCC', 2)
          ,(4, 'DDD', 1)
          ,(5, 'EEE', 2)
    ;

  -- テストテーブルの表示
    SELECT * FROM #Test;

    -- GroupNo毎にNameをカンマ区切りで表示する
    SELECT
        GroupNo
        ,STRING_AGG([Name], ',') WITHIN GROUP (ORDER BY Code) AS Member
    FROM
        #Test
    GROUP BY
        GroupNo
    ;
    
    -- テストテーブルを削除する
    DROP TABLE #Test;
END

実行結果

Code Name GroupNo
1 AAA 1
2 BBB 1
3 CCC 2
4 DDD 1
5 EEE 2
GroupNo Member
1 AAA,BBB,DDD
2 CCC,EEE

3~14行目でテストテーブルの#Testを作成し、17行目でそのデータを表示しています。実行結果の1つ目の結果となります。
20~27行目で実行結果の2つ目の結果を出力していますが、22行目のSTRING_AGG関数によりName列をカンマ区切りに変換しています。WITHIN GROUP句でName列をCode列の昇順で並べるように指定しています。
STRING_AGG関数はSQLServer2007以降で使用できます。