行データをカンマ区切りの文字列に変換する(FOR XML PATH)
SQL Serverで複数の行データをカンマ区切り(,)の文字列に変換する方法です。仕事で必要になりそうだったので調べてみましたが、最終的にSQLでやる必要はなくなりました。ただ、せっかくなので、メモとして残しておきます。
目次
- テーブル構成とデータ
- コード
- SQLの実行結果
テーブル構成とデータ
今回は、以下のテーブル構成とデータを対象に実行します。
テーブル1「example_tbl」
id | kind_id | name |
---|---|---|
1 | 1 | A1 |
2 | 1 | A2 |
3 | 1 | A3 |
4 | 2 | B1 |
5 | 2 | B2 |
6 | 3 | C1 |
7 | 3 | NULL |
8 | 3 | NULL |
9 | 4 | NULL |
10 | 4 | NULL |
テーブル2「kind_tbl」
id | name |
---|---|
1 | A |
2 | B |
3 | C |
4 | D |
コード
SQLは以下の通りです。
SELECT
id,
kind,
CASE WHEN LEN(comma_name) > 0 THEN
LEFT(comma_name, charindex(',', comma_name, LEN(comma_name)) - 1)
ELSE
NULL
END comma_name
FROM
(
SELECT
id,
name AS kind,
(
SELECT name + ','
FROM example_tbl
WHERE example_tbl.kind_id = kind_tbl.id
ORDER BY id
FOR XML PATH('')
) AS comma_name
FROM
kind_tbl
) a
上記のSQLでは、サブクエリでカンマ区切りの文字列を生成して、最終的なSELECTの「CASE WHEN ~ THEN」で一番後ろのカンマを削除しています。
SQLの実行結果
上記のSQLを実行した結果は以下の通りです。
id | kind | comma_name |
---|---|---|
1 | A | A1,A2,A3 |
2 | B | B1,B2 |
3 | C | C1 |
4 | D | NULL |