IPA過去問ドリル

令和6年度 春期 応用情報技術者試験 午前 問26

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

“部品”表及び“在庫”表に対し,SQL 文を実行して結果を得た。SQL 文の a に入れる字句はどれか。 〔部品〕(部品ID,発注点) P01,100 P02,150 P03,100 〔在庫〕(部品ID,倉庫ID,在庫数) P01,W01,90 P01,W02,90 P02,W01,150 〔結果〕(部品ID,発注要否) P01,不要 P02,不要 P03,必要 〔SQL文〕 SELECT 部品.部品ID AS 部品ID, CASE WHEN 部品.発注点 > [ a ] THEN N'必要' ELSE N'不要' END AS 発注要否 FROM 部品 LEFT OUTER JOIN 在庫 ON 部品.部品ID = 在庫.部品ID GROUP BY 部品.部品ID, 部品.発注点 (注:本サイトでは原問題の表を文字表記に変換しています)

出典:令和6年度 春期 応用情報技術者試験 午前 問26

正解:ウ

解説

在庫がない部品(P03)は在庫数の合計が求まらずNULLになりますが,発注要否の判定では在庫数0として扱う必要があります。また複数倉庫の在庫を合算するにはSUMを使う必要があります(P01はW01とW02の合計90+90=180のように,各倉庫の在庫を合算しないと正しい要否判定ができません)。したがってCOALESCE(SUM(在庫.在庫数), 0)によって,在庫がない場合は0として扱いつつ,複数倉庫分を合算します。

選択肢ごとの解説

  • 誤り。MINでは複数倉庫の在庫数のうち最小値しか使われず,倉庫ごとの在庫を合算した実際の総在庫数にはなりません。
  • 誤り。MINに加えて,在庫がない場合にNULLのままにしてしまうと,発注点との比較(>)が正しく行えません。
  • 正しい。SUMで倉庫ごとの在庫数を合算し,在庫がない部品はCOALESCEで0として扱うことで,発注点との比較が正しく行えます。
  • 誤り。SUMで合算すること自体は正しいですが,在庫がない場合にNULLのままでは発注点との比較が正しく行えません。
応用情報技術者の過去問を演習モードで解く