m6uのエンジニアっぽい日記

PHP利用開発やFuelPHP利用開発、PostgreSQL利用開発、Androidアプリ開発、CentOS7サーバー構築など、テクニカルでエンジニアっぽい内容の日記

PostgreSQL: VALUES句の便利な使い方、データがなくてもゼロを取得する

 以前やったことを忘れがちなので、改めてここにまとめておく。

SELECT *
FROM (
  VALUES (1::integer), (2), (3), (5), (7), (11)
) AS tbl(tbl_cd)

 これは何をやっているのかというと、本来はテーブルから読みだして連結させるべきところを、SELECT文中で固定値でテーブルから読みだしたように扱う方法。

SELECT *
FROM (
  VALUES (1::integer, 'お店A'::text), (2, 'お店B'), (3, 'お店C'), (5, 'お店D'), (7, 'お店E'), (11, 'お店F')
) AS shop_tbl(shop_cd, shop_name)

 これに対してLEFT JOINを使うとすごく便利に感じた。
 例えば、特定店舗の売上データを集計するとする。 あるテーブルにshop_cdをキーにした売上データが入っていて、shop_tblはデータベース格納していなくて、特定のshop_cdに対して売上データを読み取りたい場合。

SELECT s.shop_cd, s.shop_name, coalesce(a.sales_amount, 0) AS sales_amount
  SELECT *
  FROM (
    VALUES (1::integer, 'お店A'::text), (2, 'お店B'), (3, 'お店C'), (5, 'お店D'), (7, 'お店E'), (11, 'お店F')
  ) AS shop_tbl(shop_cd, shop_name)
) AS s
LEFT JOIN (
  SELECT shop_cd, sales_amount
  FROM sales_amounts
  WHERE ...
) AS a ON s.shop_cd = a.shop_cd

みたいに記述すれば、売上データがない店舗でも結果としてゼロを取得できるので、例えばphpからクエリー実行した場合にphp側で売上データがない場合の例外処理を記述しなくても済むようになる。
 (予め、売上のない日でも売上ゼロを記録しておく、というのも一つの解決方法ではありますが。)