複数行のカラムをstring_agg()で1つの文字列にまとめる方法!PostgerSQLの勉強

例えば left join などで集約したデータを作成していたらこのIDでひとつにまとめたい、でも item カラムのどちらの行の情報も残したいなという時があると思います。そんな時にカラムを1つの行にまとめて表示できないかなと思い調べてみました。

目標

いかのような項目があったとします。

2アイマスク
2ティッシュ

それを以下のようにまとめたい。

2アイマスク, ティッシュ

動作環境

SQLiteonlineSQL FIDDLEでPostgreSQL9.6、MS SQL server2017 (日本語は文字化け) で動作確認しました。
下記文章は主にPostgreSQLで仕様で調べています。

複数行のカラムをstring_agg()で1つの文字列にまとめる方法

サンプルコードとともにどのように複数行を1つにまとめるか詳しく書いていきます。

string_agg()

複数行を一つにまとめるために string_agg() を利用します。
string_agg() は入力された値を指定したデリミタで区切られた一つの文字列に連結してくれます。

構文

string_agg(expression, delimiter)

引数は(text, text)または(bytea, bytea)に対応しています。数値は無理なようです。

今回は (text, text)で expression にカラムを入れます。delimiter (デリミタ)には区切り文字が入ります。

実際に複数行のカラムを1つにまとめてみる!

実際に複数行のカラムを1つにまとめるサンプルコードとともに動きを確認してみましょう。

準備

使用するテーブルは以下になります。

parcei_cditem
1参考書
2アイマスク
2ティッシュ
2目薬
3キーボード
3マウス

上記テーブルを作成する文です。

-- CREATE文
CREATE TABLE delivery (
parceI_cd numeric(8, 0) not null,
item character varying (20) not null
);
-- INSERT文
insert into delivery
values(0001, '参考書'),
(0002, 'アイマスク'),
(0002, 'ティッシュ'),
(0002, '目薬'),
(0003, 'キーボード'),
(0003, 'マウス');

サンプルコード

上記のテーブルを使って出荷する品物(item)を1つの箱(parcei_cd)に入れるもので1行にまとめるイメージでSELECT文を作成したいと思います。

作成した SELECT 文

SELECT
    parceI_cd,
    string_agg( item, ', ') as item_list
FROM
    delivery
GROUP BY
    parcei_cd

結果

parcei_cditem_list
1参考書
2アイマスク, ティッシュ, 目薬
3キーボード, マウス

カンマ区切りで itemカラムの項目がまとめられました!GRUP BYでまとめられた項目を羅列してくれます。

おわり

実際に仕事でこのケースに当たった時はこのまとめる前のテーブルを作成するので複数テーブルから情報を集めてきた後だったので、その後にstring_agg()で文字列をまとめることはさほど難しく感じませんでした。

PostgreSQL, SQL

Posted by Nakamoto