応用情報技術者試験ナビ ロゴ 応用情報技術者試験ナビ
次回試験日:2025年4月20日(あと1日)

応用情報技術者試験 令和6年春 午前問26 解説付き過去問

問題

"部品"表及び"在庫"表に対し、SQL文を実行して結果を得た。 SQL文のaに入れる字句はどれか。



〔SQL文〕
SELECT 部品.部品ID AS 部品ID,
 CASE WHEN 部品.発注点 > a
  THEN N'必要' ELSE N'不要' END AS 発注要否
FROM 部品 LEFT OUTER JOIN 在庫
 ON 部品.部品ID=在庫.部品ID
GROUP BY 部品.部品ID、部品.発注点

正解

解説

SQL文における COALESCE 関数は、引数の中で最初に NULL でない値を返す関数である。今回の問題では、部品表と在庫表を左外部結合して、部品ごとの在庫数を集計し、その合計値が発注点より少ないかどうかで「発注が必要かどうか」を判定している。

このとき、在庫表に該当データが存在しない部品(P03)のようなケースでは、SUM(在庫.在庫数) が NULL となるため、そのままでは 部品.発注点 > NULL の比較ができず、発注要否の判定が不可能になる。そこで NULL を 0 に変換する COALESCE 関数を用いる。

  • 集計関数とCOALESCEの役割
    今回の判定には、同一部品IDに該当する在庫の在庫数を合計する必要があるため、SUM(在庫.在庫数) を使う。
    一方、P03のように在庫データが存在しない場合は SUM の結果が NULL となるが、COALESCE(SUM(在庫.在庫数), 0) によってこれを 0 に補正することで、正しく「発注点 > 0」と評価できるようになる。

  • 各選択肢の比較
    - COALESCE(MIN(...), ...) は最小値を返すため、複数倉庫の合計数が必要なこのケースには不適切。
    - NULL をそのまま残すと、NULL との比較は常に UNKNOWN を返すため「必要」と判定できない。
    - SUM(...), 0 の組み合わせが、発注点との正確な比較のために最適である。

  • SQL文の意図
    - 「LEFT OUTER JOIN」により在庫情報が存在しない部品も含めて全件を対象とし、
    - GROUP BY で部品IDごとに集計し、
    - CASE 文で発注の必要性を判断している。

このように、COALESCE(SUM(在庫.在庫数), 0) を使用することで、在庫が登録されていない部品についても在庫数0とみなし、正しく発注要否を判定できる。よって、SQL文の a に入る適切な句はこれである。