2024
October
17
グループ化したカラムを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.26
ZOHO CRM APIを活用したレコードの削除方法
2024.01.17
growpartによるさくらVPSのパーティション拡張
2024.10.23
名刺を画像から読み取り、ChatGPTで解析するシステムの構築 その1
2024.06.07
【Laravel】Docker環境でmigrationを実行するとcould not translate host nameエラーが発生する件について