1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Postgres の GROUP BY と NULL / 0件時の挙動まとめ

Posted at
  1. はじめに
    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 置換に使えるが、行がない場合は意味がない

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?