- はじめに
Postgres で GROUP BY を使う際に、NULL や対象行が存在しない場合の挙動は意外と誤解されやすいです。本記事では、実際の挙動を整理して、0件でも結果を返したい場合の対応方法まで解説します。
基本挙動
2.1 NULL を含む場合
SELECT x, COUNT(*)
FROM a
GROUP BY x;
x に NULL が含まれている場合も 1つのグループ として集計されます。
行が存在しない場合
GROUP BY は「存在する行だけ」を集計対象にします。
行がゼロ件の場合 → グループは作られず、結果も 0 行。
COALESCE() の使用
COALESCE(列, '代替値') は NULL を置き換えるだけ。
行が存在しない場合は意味がありません。
0件でも結果を返す方法
0件でもダミー行として返したい場合は、ダミー行やマスタテーブルと LEFT JOIN します。
WITH dummy AS (
SELECT '未取得' AS c
)
SELECT dummy.c, COUNT(x.b) AS cnt
FROM dummy
LEFT JOIN A ON A.c = dummy.c
LEFT JOIN x ON x.x = A.a
GROUP BY dummy.c;
LEFT JOIN にすることで、A に行がなくても dummy の 1 行として返せます。
0件でも集計結果を返すことが可能です。
まとめ
GROUP BY は 行が存在する場合のみ グループ化する
NULL を含む列も 1つのグループ として扱われる
行が存在しない場合は 0行 になる
0件でも返したい場合は ダミー行 + LEFT JOIN が必要
COALESCE() は NULL 置換に使えるが、行がない場合は意味がない