戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

データベーススペシャリスト試験 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 部署コード
データベーススペシャリスト試験 2017年 午前2 問08の問題画像

選択肢

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 0
ELSE -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 情報処理技術者試験対策アプリ

プライバシーポリシー利用規約開発者について