データ操作 (全67問中3問目)
No.3
"部品"表及び"在庫"表に対し,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,部品.発注点
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)
分類
テクノロジ系 » データベース » データ操作
正解
ウ
解説
COALESCE句は、引数を左から順に調べて、最初のNULLではない値を返す関数です。すなわち、第1引数がNULLでなければ第1引数の値を返し、第1引数がNULLであれば第2引数の値を返します。2つを超える引数を指定することも可能です。
まず、FROM句とGROUP BY句によって得られる中間表を考えます。FROM句では、部品表と在庫表を"部品ID"列で左外部結合しているので、結合後の中間表は以下のようになります。GROUP BY句では、この中間表を"部品ID"列、"発注点"列ごとにグループ化するので結果は以下のようになります。このグループ化された中間表に対してCOALESCE句を適用したときに、〔結果〕のようにP01とP02は'不要'に、P03は'必要'になるものはどれかを考えています。
まず、FROM句とGROUP BY句によって得られる中間表を考えます。FROM句では、部品表と在庫表を"部品ID"列で左外部結合しているので、結合後の中間表は以下のようになります。GROUP BY句では、この中間表を"部品ID"列、"発注点"列ごとにグループ化するので結果は以下のようになります。このグループ化された中間表に対してCOALESCE句を適用したときに、〔結果〕のようにP01とP02は'不要'に、P03は'必要'になるものはどれかを考えています。
- MIN関数はグループの列値の中で最小値を返します。P03のNULLはCOALESCE句により0に変換されます。
- MIN関数が返す値 P01=90、P02=150、P03=NULL
- COALESCE句が返す値 P01=90、P02=150、P03=0
- 「ア」と同様の流れで、MIN関数の結果は、COALESCE句によりP01=90、P02=150、P03=NULLに変換されます。「ア」と同じく発注要否は、P01は'必要'、P02は'不要'となります。P03はNULL値との比較であり常にUNKNOWNを返すため、P03も'不要'となります。P01が'必要'、P03が'不要'となるので誤りです。
- 正しい。SUM関数はグループの列値の合計を返します。P03のNULLはCOALESCE句により0に変換されます。
- SUM関数が返す値 P01=180、P02=150、P03=NULL
- COALESCE句が返す値 P01=180、P02=150、P03=0
- 「ウ」と同様の流れで、SUM関数の結果は、COALESCE句によりP01=180、P02=150、P03=NULLに変換されます。「ウ」と同じく、P01とP02の発注要否は'不要'となり、NULL値との比較であるP03も'不要'となります。P03が'不要'となるので誤りです。