2024
September
05
グループ化したカラムを1行にまとめる方法
注文毎に買った商品をまとめたいとか、
特定の日に予約してる人をまとめて表示したいという場合があると思います。
そんな時に使える関数「string_agg」を紹介します。
※この記事はPostgreSQL 13.5 で動作確認してます。
string_agg とは
GROUP BY句内で使えるデリミタで区切られた一つの文字列に連結する機能になります。
注文テーブル
注文ID | 商品名 | 個数 |
A | りんご | 2 |
A | ぶどう | 3 |
B | みかん | 1 |
C | りんご | 6 |
C | みかん | 3 |
C | なし | 2 |
SQL
SELECT 注文ID , string_agg(商品名,'/') AS 商品名
GROUP BY 注文ID
ORDER BY 注文ID
出力結果
注文ID | 商品名 |
A | りんご/ぶどう |
B | みかん |
C | りんご/みかん/なし |
グループ化されて、商品名も1行にまとめられました!
注意事項
text型、もしくはbytea型しか対応してないので数値や日付は対応していません。
そのため、数値や日付を出力したい場合はTO_CHAR関数でtext型に変換する必要があるので注意です。
補足
SELECT 注文ID , string_agg(商品名,'/' ORDER BY 商品名) AS 商品名
GROUP BY 注文ID
ORDER BY 注文ID
上記のようにstring_agg内でソートも追加可能です。
GROUP BYで指定しているカラムのみという指定もないので好きなソートが可能です。
まとめ
GROUP BYで集約した中身を見たいと思った時に便利な関数になります。
通常通り表示させたい場合ももちろん使えますが、テストで正しくグループ化されているかの出力確認に使うこともできます。
このカテゴリの最新記事
2024.06.21
【Linux】特定のディレクトリ配下のみアクセスできるFTPユーザーを作成する
2023.12.06
【Laravel】MiddlewareでIP制限をする
2024.08.22
centos7サポート終了に伴うOSの移行について
2024.04.03
【Laravel】パスワードリセット メールアドレス入力欄のバリデーションに独自ルールを追加する