IPA過去問ドリル

平成29年度 春期 データベーススペシャリスト試験 午前Ⅱ 問8

テクノロジ/データベース

“社員”表から,部署コードごとの主任の人数と一般社員の人数を求めるSQL文とするために,aに入る字句はどれか。ここで,実線の下線は主キーを表す。 社員(社員コード,部署コード,社員名,役職) 〔SQL文〕 SELECT 部署コード, COUNT(CASE WHEN 役職 = '主任' [ a ]) AS 主任の人数, COUNT(CASE WHEN 役職 = '一般社員' [ a ]) AS 一般社員の人数 FROM 社員 GROUP BY 部署コード 〔結果の例〕 部署コード|主任の人数|一般社員の人数 AA01|2|5 AA02|1|3 BB01|0|1

出典:平成29年度 春期 データベーススペシャリスト試験 午前Ⅱ 問8

正解:ウ

解説

COUNT関数は,NULLを除いた値の個数を数える集計関数です。CASE式で条件に一致する行には1を返し,一致しない行にはNULLを返すようにすれば,COUNT関数はNULLを無視して数えるため,条件に一致する行数だけを正しく集計できます。したがって,aには「THEN 1 ELSE NULL」が入ります。

選択肢ごとの解説

  • 誤り。ELSE -1とすると,条件に一致しない行についても-1という値がCOUNTの対象(NULLでない値)としてカウントされてしまい,正しい人数が得られません。
  • 誤り。ELSE 0とすると,条件に一致しない行についても0という値がCOUNTの対象としてカウントされてしまい,実際の該当人数より多く数えられてしまいます。
  • 正しい。ELSE NULLとすることで,条件に一致しない行はCOUNTの対象外(NULLは数えない)となり,条件に一致した行数だけを正しく数えられます。
  • 誤り。THEN NULL ELSE 1とすると,条件に一致する行がNULLになりCOUNT対象外となる一方,一致しない行が1としてカウントされてしまい,主任の人数と一般社員の人数が逆に集計されてしまいます。
データベーススペシャリストの過去問を演習モードで解く