データベーススペシャリスト 2017年 午前2 問08
問題文
“社員”表から、部署コードごとの主任の人数と一般社員の人数を求めるSQL文とするために、aに入る字句はどれか。ここで、実線の下線は主キーを表す。
社員(社員コード、部署コード、社員名、役職)
〔SQL文〕
SELECT 部署コード、
COUNT(CASE WHEN 役職 = '主任' <b>(a)</b> END) AS 主任の人数、
COUNT(CASE WHEN 役職 = '一般社員' <b>(a)</b> END) AS 一般社員の人数
FROM 社員 GROUP BY 部署コード

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

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

