社員表の部署コードごとの役職人数集計SQL【午前2 解説】
要点まとめ
正解の理由
SQLの
COUNT
関数はNULL値をカウントしません。
そのため、
CASE WHEN 役職 = '主任' THEN 1 ELSE NULL END
とすることで、「主任」の行は1となりカウントされ、「主任」でない行はNULLとなりカウントされません。
これにより、部署ごとの主任人数を正確に集計できます。
同様に一般社員の人数も同じロジックで求められます。
よくある誤解
COUNT
は0や-1もカウント対象になるため、
ELSE 0
や
ELSE -1
を使うと全行がカウントされてしまいます。
ELSE NULL
を使うことが正しい集計のポイントです。
解法ステップ
- 集計したい条件(役職が「主任」か「一般社員」か)を
CASE WHEN
で指定する。
- 条件に合致する場合は
1
を返し、合致しない場合はNULL
を返す。
COUNT
関数でNULL以外の値をカウントし、条件に合致する行数を求める。
- 部署コードごとに
GROUP BY
で集計する。
選択肢別の誤答解説
- ア:
THEN 1 ELSE -1
- ELSEが-1なので、全行がカウントされてしまい正確な人数が得られません。
- イ:
THEN 1 ELSE 0
- ELSEが0のため、0もカウントされてしまい誤った集計結果になります。
- ウ:
THEN 1 ELSE NULL
- 条件に合致しない場合はNULLとなり、
COUNT
でカウントされず正確な人数が得られます。
- エ:
THEN NULL ELSE 1
- 条件に合致しない場合に1を返すため、逆にカウントされてしまい誤集計となります。
補足コラム
SQLの
COUNT
関数は「NULL以外の値の個数」を数えるため、条件付き集計では
CASE WHEN
で条件に合致しない場合にNULLを返すのが定石です。
また、
SUM
関数を使い
CASE WHEN 役職 = '主任' THEN 1 ELSE 0 END
とする方法もありますが、
COUNT
を使う場合はNULLを返すのがポイントです。
FAQ
Q: なぜ
ELSE 0
ではダメなのですか?
A:
COUNT
は0もカウント対象なので、条件に合致しない行もカウントされてしまい正確な人数が得られません。
Q:
SUM
関数を使う場合はどう書けばよいですか?
A:
SUM(CASE WHEN 役職 = '主任' THEN 1 ELSE 0 END)
とし、条件に合致する行だけ1を足し合わせます。
関連キーワード: SQL, COUNT関数、CASE文、集計関数、NULLの扱い、グループ集計、部署別人数集計