SQL Server 2017 の新機能の中に、複数行のデータを1行にまとめて表示することができるSTRING_AGG関数がある。
今回は、STRING_AGG関数を使って、key-value形式で設定されているデータを複数行のデータを1行にまとめて表示してみたので、その手順を共有する。
前提条件
以下の記事に従って、Azure SQL Databaseの作成が完了していること。
Azure Potal上でSQLデータベースを作成してみたAzure Portal上では、常に最新の安定したバージョンの SQL Serverデータベースである「SQL データベース」が利用でき...
また、A5M2からAzure SQL Databaseに接続できていること。その手順は、以下の記事を参考にすること。
A5M2を利用して各DBに接続してみたA5M2(A5:SQL Mk-2)は、SQL文の入力支援やER図作成などの機能を備えていて、Oracle、MySQL、PostgreSQ...
STRING_AGGを利用したSQL実行
STRING_AGGを利用し、複数行のデータを1行にまとめて表示した実行例は、以下の通り。
1) 以下のデータがある状態からスタートする。
SELECT * FROM user_address ORDER BY user_id ASC, user_key ASC, id ASC

2) STRING_AGG関数を使わずに、user_idとuser_key=’address’であるデータを抽出した結果は、以下の通り。
SELECT
user_id
, user_value
FROM user_address
WHERE user_key = 'address'
ORDER BY user_id ASC, id ASC
3) STRING_AGG関数を使って、user_idとuser_key=’address’であるデータを抽出した結果は以下の通りで、2)と同じ結果になる。
SELECT
user_id
, STRING_AGG(CASE user_key WHEN 'address' THEN user_value ELSE NULL END, ',') AS address
FROM user_address
GROUP BY user_id
ORDER BY user_id ASC

4) STRING_AGG関数を使わずに、user_idとuser_key=’mail’であるデータを抽出した結果は以下の通りで、同一user_idのメールアドレスが複数行に表示されることが確認できる。
SELECT
id
, user_id
, user_value
FROM user_address
WHERE user_key = 'mail'
ORDER BY user_id ASC, id ASC
5) STRING_AGG関数を使って、user_idとuser_key=’mail’であるデータを抽出した結果は以下の通りで、同一user_idのメールアドレスが、カンマ区切りで1行に集約し表示されることが確認できる。
SELECT
user_id
, STRING_AGG(CASE user_key WHEN 'mail' THEN user_value ELSE NULL END, ',')
WITHIN GROUP (ORDER BY id ASC) AS mail
FROM user_address
GROUP BY user_id
ORDER BY user_id ASC
6) STRING_AGG関数を使って、user_idと全体のデータを抽出した結果は以下の通りで、user_id毎に1行に集約し表示されることが確認できる。
SELECT
user_id
, STRING_AGG(CASE user_key WHEN 'post' THEN user_value ELSE NULL END, ',') AS post
, STRING_AGG(CASE user_key WHEN 'address' THEN user_value ELSE NULL END, ',') AS address
, STRING_AGG(CASE user_key WHEN 'phone' THEN user_value ELSE NULL END, ',')
WITHIN GROUP (ORDER BY id ASC) AS phone
, STRING_AGG(CASE user_key WHEN 'mail' THEN user_value ELSE NULL END, ',')
WITHIN GROUP (ORDER BY id ASC) AS mail
FROM user_address
GROUP BY user_id
ORDER BY user_id ASC
要点まとめ
- STRING_AGG関数は、複数行のデータを1行にまとめて表示することができる関数で、SQL Server 2017以降のバージョンで利用できる。





