SQLのCASE式と外部結合・集計処理

SQL 文では,部品ごとに複数の倉庫に分散している在庫の合計(総在庫数)と発注点を比較し,発注点より総在庫数が少なければ(発注点 $>$ 在庫数)「必要」,そうでなければ「不要」と判定しています。 したがって,グループ化された部品ごとに集計すべき値は「在庫数の合計」なので,集計関数には SUM を使用します(MIN ではありません)。 また,LEFT OUTER JOIN(左外部結合)を使用しているため,在庫レコードが 1 件も存在しない部品(P03)では,結合後の「在庫.在庫数」が NULL となり, SUM(在庫.在庫数) の結果も NULL になります。 NULL のまま発注点と比較すると条件判定が UNKNOWN となり正しく判定できないため,COALESCE 関数を用いて NULL の場合に 0 に置換する必要があります( COALESCE(SUM(在庫.在庫数), 0) )。 したがって,正解はウとなります。 各選択肢の解説は以下のとおりです。 MIN 関数は最小値を求める関数であり,複数倉庫の在庫の合計数を評価できません。 MIN 関数を用いている点,および第2引数に NULL を指定すると NULL のままとなり置換されない点が誤りです。 COALESCE の第2引数に NULL を指定すると,SUM が NULL のときに NULL が返されるため,0 として比較判定することができません。 部品ID 発注点 結合した在庫数 SUM COALESCE(SUM, 0) 発注点 > 値 結果 P01 100 90, 90 180 180 偽 不要 P02 150 150 150 150 偽 不要 P03 100 NULL(在庫なし) NULL 0 真 必要 MIN だと P01 は 90 になり「必要」と判定されてしまいます。また COALESCE を使わないと P03 の比較が NULL(不明)になり、ELSE の「不要」になってしまいます。

“部品”表及び“在庫”表に対し,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)