COALESCE句|科目A-1(応用情報技術者) 令和6年 春期午前試験 問26

出典:令和6年春期 午前 問26 分野:データベース / データ操作
"部品"表及び"在庫"表に対し,SQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。 COALESCE句
  • ア:COALESCE(MIN(在庫.在庫数),0)
  • イ:COALESCE(MIN(在庫.在庫数),NULL)
  • ウ:COALESCE(SUM(在庫.在庫数),0)
  • エ:COALESCE(SUM(在庫.在庫数),0)
解説

このSQL文では、部品ごとの「発注点」と「在庫数」を比較し、発注点の方が大きければ「必要」、そうでなければ「不要」と判定しています。

ここで重要なのは、同じ部品が複数の倉庫に保管されている場合には、各倉庫の在庫数を合計して判定する必要があることです。

P01は、W01とW02にそれぞれ90個ずつ在庫があるので、在庫数の合計は、

90 + 90 = 180個

です。発注点は100個なので、

100 > 180

は偽となり、「不要」です。

P02は在庫数が150個、発注点も150個なので、

150 > 150

は偽となり、「不要」です。

P03は「在庫」表に該当する行がありません。LEFT OUTER JOINによってP03自体は結果に残りますが、SUM(在庫.在庫数)の結果はNULLになります。

そこでCOALESCEを使い、NULLの場合には0として扱います。

COALESCE(SUM(在庫.在庫数), 0)

とすれば、P03については、

100 > 0

となるので、「必要」と判定されます。

実行結果は、P01が「不要」、P02が「不要」、P03が「必要」となり、設問の結果と一致します。

したがって、ウが適切です。

❌他選択肢が誤りの理由
ア:COALESCE(MIN(在庫.在庫数), 0)
⇒MINを使うと、各部品について在庫数の合計ではなく、最も少ない倉庫の在庫数と発注点を比較してしまいます。
P01:MIN(90, 90) = 90なので、100 > 90となり「必要」
P02:MIN(150) = 150なので、150 > 150は偽となり「不要」
P03:在庫がないのでCOALESCEによって0となり、100 > 0で「必要」
実行結果は「P01:必要、P02:不要、P03:必要」となり、P01が設問の結果と一致しません。
イ:COALESCE(MIN(在庫.在庫数), NULL)
⇒MINを使っているので、P01では在庫合計180個ではなく最小値90個が使われます。また、COALESCEの代替値もNULLなので、P03のNULLを0に置き換えることができません。
P01:MIN(90, 90) = 90なので、100 > 90となり「必要」
P02:MIN(150) = 150なので、150 > 150は偽となり「不要」
P03:MINの結果がNULLのままなので、100 > NULLの結果はUNKNOWNとなり、CASE WHENの条件を満たさないため「不要」
実行結果は「P01:必要、P02:不要、P03:不要」となります。
エ:COALESCE(SUM(在庫.在庫数), NULL)
⇒SUMを使う点は適切なので、P01とP02は正しく判定できます。しかし、P03ではSUMの結果がNULLとなり、COALESCEの代替値もNULLなので、在庫数を0として扱えません。
P01:SUM(90, 90) = 180なので、100 > 180は偽となり「不要」
P02:SUM(150) = 150なので、150 > 150は偽となり「不要」
P03:SUMの結果がNULLのままなので、100 > NULLの結果はUNKNOWNとなり、CASE WHENの条件を満たさないため「不要」
実行結果は「P01:不要、P02:不要、P03:不要」となり、P03が設問の結果と一致しません。
TSUNAGARU-ADVICE

まず押さえたいこと

在庫数を部品IDごとにまとめて判定する場合は、各倉庫の在庫数を合計して、その合計在庫と発注点を比較するのが基本です。GROUP BYによって部品単位に集約されるため、集約関数としてSUMを使うかどうかに注目します。

迷ったときの判断軸

LEFT OUTER JOINでは、在庫表に該当行がない部品も結果に残ります。このときSUMの結果はNULLになるため、COALESCEを使ってNULLを0として扱う必要があります。MINでは最小の在庫数しか見ないため、複数倉庫の在庫総数を判定できません。

科目Bにつなげるために

特にプロフェッショナルデジタルスキル(データ・AI)試験合格を目指す方は、この問題を外部結合・GROUP BY・集約関数?NULL処理の組合せとして整理しましょう。実務でも、在庫や売上などを複数行から集計し、欠損データを適切に扱って判定するSQLは頻繁に使われます。