PostgreSQL:複数行の結果をまとめて1行として表示する

最終更新日時:2014-04-04 15:53:33
PostgreSQL

SQL の SELECT 文は、基本的には DB のテーブルを行単位で処理するような設計となっており、それぞれの行を関連づける際には、いわゆる結合を行うこととなります。
結合では、テーブル同士の結合条件が指定でき、この「テーブル同士」は同じテーブルを指定しても構わないのですが、可変個のテーブルを結合する、、、といったことは出来ないように思えます。

ようするに、ある SELECT の結果に対して、特定の条件を持つ複数のレコードを結合する、、、と言ったことが結合では出来ません。
これを実現するのが、GROUP BY を使った集約関数ですが、集約関数はかなり限定されたものしか用意されていません。
例えば、

店舗名,日付,売上

みたいなテーブル「店舗売上」があったとして、店舗ごとの売上の総額を求める場合には、

 SELECT 店舗名,sum(売上) FROM 店舗売上 GROUP BY 店舗名


のように、集約関数 sum() を使えば簡単に求められますが、「店舗ごとの売上を文字列にしてまとめて表示する」といった場合には、適切な集約関数がありません。
sum() が文字列を連結するといった機能を持っていれば同様に簡単なわけですが。


このような場合、PostgreSQL であれば、以下のように配列の概念を使うと実現できます。

 SELECT 店舗名,ARRAY_TO_STRING(ARRAY(SELECT 売上 FROM 店舗売上 t1 WHERE t1.店舗名=t2.店舗名),'|') FROM 店舗売上 t2 GROUP BY 店舗名


いわゆる自己参照型の副問い合わせなのであまり美しくないのですが、意外とコストは高くないようです。

上記のような、無理矢理感満載の SQL を書きたくない場合には、素直に集約関数を作ってしまうのが良いと思います(^_^;
例えば、sum() で文字列を連結するような集約関数とか(^_^;

お問い合わせは 掲示板 にて。