令和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, 部品.発注点- アCOALESCE(MIN(在庫.在庫数), 0)
- イCOALESCE(MIN(在庫.在庫数), NULL)
- ウCOALESCE(SUM(在庫.在庫数), 0)
- エCOALESCE(SUM(在庫.在庫数), NULL)
答えと解説を見る
✓ これが正解ウCOALESCE(SUM(在庫.在庫数), 0)
解説
在庫を合計し、行が無い部品は 0 に置きます。
設問は、示された二つの表から示された結果が得られるように、条件式の中の空欄を埋めさせています。軸になるのは、四つの候補が集約の仕方と既定値という二つの軸の組合せでできていることです。まず集約の仕方を決めます。部品 P01 は二つの倉庫に 90 ずつ置かれており、合計を取れば 180 になって発注点の 100 を上回るので、結果の表と同じく発注は不要という判定になります。次に既定値を決めます。部品 P03 は在庫の表に 1 行もありませんが、外側の結合なので行そのものは残り、在庫の側は空値になります。集約は対象が無ければ空値を返すため、そこを 0 に置き換えると、発注点の 100 が 0 を上回って発注が必要という判定になり、これも結果の表と一致します。最後に三行とも当てはめます。P02 は 150 と 150 が等しく、より大きいかを問う比較は成り立たないので、発注は不要という判定になり、示された結果とすべて合います。
ほかの選択肢はなぜ違うのか
- アCOALESCE(MIN(在庫.在庫数)…:倉庫ごとの在庫のうち最も少ない値を取る形です。二つの倉庫に 90 ずつ置かれた部品では 90 となって発注点の 100 を下回るため、必要という判定になってしまい、示された結果と食い違います。
- イCOALESCE(MIN(在庫.在庫数)…:最も少ない値を取るうえに、置き換える先として空値そのものを書いています。倉庫が複数ある部品で合わないことに加え、在庫の行が無い部品でも比較が定まらず、二重に結果から外れます。
- エCOALESCE(SUM(在庫.在庫数)…:合計を取るところまでは合っていますが、置き換える先が空値のままです。在庫の行が無い部品では比較が真とも偽とも決まらないので、条件が成り立たないほうへ落ち、必要という判定が出てきません。
出典:令和6年度 春期 応用情報技術者試験 午前 問26(改変:原典の図表をテキストに書き起こした)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)