データベーススペシャリスト試験 2017年 午前208


“社員”表から、部署コードごとの主任の人数と一般社員の人数を求める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 解説】

要点まとめ

  • 結論:CASE WHEN 役職 = '主任' THEN 1 ELSE NULL END のように、条件に合致しない場合はNULLを返すのが正解です。
  • 根拠:COUNT関数はNULLをカウントしないため、条件に合致した行だけを正確に数えられます。
  • 差がつくポイント:COUNTの特性を理解し、誤って0や-1を返すと誤カウントになる点に注意しましょう。

正解の理由

SQLのCOUNT関数はNULL値をカウントしません。
そのため、CASE WHEN 役職 = '主任' THEN 1 ELSE NULL ENDとすることで、「主任」の行は1となりカウントされ、「主任」でない行はNULLとなりカウントされません。
これにより、部署ごとの主任人数を正確に集計できます。
同様に一般社員の人数も同じロジックで求められます。

よくある誤解

COUNTは0や-1もカウント対象になるため、ELSE 0ELSE -1を使うと全行がカウントされてしまいます。
ELSE NULLを使うことが正しい集計のポイントです。

解法ステップ

  1. 集計したい条件(役職が「主任」か「一般社員」か)をCASE WHENで指定する。
  2. 条件に合致する場合は1を返し、合致しない場合はNULLを返す。
  3. COUNT関数でNULL以外の値をカウントし、条件に合致する行数を求める。
  4. 部署コードごとに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の扱い, グループ集計, 部署別人数集計
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ