複数行をまとめて1行に表示する方法

とりあえずデータを適当に準備

schedule_id    report_id    report_name

1                      001             テスト1
1                      002             テスト2
1                      003             テスト3
2                      001             テスト1
3                      004             テスト4

 

FOR XML PATHを利用して、こんな感じのSQLを作成

 

SELECT schedule_id,
REPLACE((
SELECT report_name AS [data()]
FROM t_report
WHERE A.schedule_id = schedule_id
FOR XML PATH('')
),' ',',')  AS report_name
FROM t_report A
GROUP BY schedule_id

 

注意点として「t_report」にはエイリアスをつけておかないといけない。

WHERE A.schedule_id = schedule_id

WHERE t_report .schedule_id = schedule_id

では思った結果が取れなかった。

 

空白区切りになるのでREPLACEを利用して「,」区切りへ

 

結果はこんな感じ

1    テスト1,テスト2,テスト3
2    テスト1
3    テスト4

 

AS [data()]とすることでXML のエレメントを生成させないようにできる。

 

AS [data()] を AS report_nameとかにしてみると

こんな感じの結果が返ってくる。

1    <report_name>テスト1</report_name><report_name>テスト2</report_name><report_name>テスト3</report_name>
2    <report_name>テスト1</report_name>
3    <report_name>テスト4</report_name>