令和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
- アCOALESCE(MIN(在庫.在庫数), 0)
- イCOALESCE(MIN(在庫.在庫数), NULL)
- ウCOALESCE(SUM(在庫.在庫数), 0)
- エCOALESCE(SUM(在庫.在庫数), NULL)
正解:ウ
解説
在庫がない部品(P03)は在庫数の合計が求まらずNULLになりますが,発注要否の判定では在庫数0として扱う必要があります。また複数倉庫の在庫を合算するにはSUMを使う必要があります(P01はW01とW02の合計90+90=180のように,各倉庫の在庫を合算しないと正しい要否判定ができません)。したがってCOALESCE(SUM(在庫.在庫数), 0)によって,在庫がない場合は0として扱いつつ,複数倉庫分を合算します。
選択肢ごとの解説
- ア誤り。MINでは複数倉庫の在庫数のうち最小値しか使われず,倉庫ごとの在庫を合算した実際の総在庫数にはなりません。
- イ誤り。MINに加えて,在庫がない場合にNULLのままにしてしまうと,発注点との比較(>)が正しく行えません。
- ウ正しい。SUMで倉庫ごとの在庫数を合算し,在庫がない部品はCOALESCEで0として扱うことで,発注点との比較が正しく行えます。
- エ誤り。SUMで合算すること自体は正しいですが,在庫がない場合にNULLのままでは発注点との比較が正しく行えません。