“部品”表及び“在庫”表に対し、SQL文を実行して結果を得た。SQL文の a に入
れる字句はどれか。
部品 在庫
┌───┬───┐┌───┬───┬───┐
│部品ID│発注点││部品ID│倉庫ID│在庫数│
┝━━━┿━━━┥┝━━━┿━━━┿━━━┥
│P01│100││P01│W01│ 90│
├───┼───┤├───┼───┼───┤
│P02│150││P01│W02│ 90│
├───┼───┤├───┼───┼───┤
│P03│100││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(式1, 式2, ・・・, 式N) は、式1が非NULLなら式1を返すが、式1がNULLなら式2を返す。さらに式2がNULLなら、式3を返す。・・・さらに式NがNULLならNULLを返す、という関数である。
0を返さないと部品.発注点と大小比較ができないので、アかウに絞られる。
また、MIN()は最小値を返す関数であり、SUM()は合計値を返す関数である。
在庫テーブルにおいて、部品P01は倉庫W01,W02にあり、発注要否が不要であるから、 a の中には、MINではなく、SUMでなければならないことが判る。(MINなら90で、発注点より小さくなるから必要となるはず)
SQL文の意味は、以下のとおり。
SELECT 部品.部品ID AS 部品ID,
CASE WHEN 部品.発注点 > COALESCE(SUM(在庫.在庫数), 0)
THEN N ’必要’ ELSE N '不要’ END AS 発注要否
FROM 部品 LEFT OUTER JOIN 在庫
ON 部品.部品ID = 在庫.部品ID
GROUP BY 部品.部品ID, 部品.発注点
在庫テーブルに部品IDがあってもなくても、部品IDとして部品テーブルの部品IDとともに、
発注要否として部品テーブルの部品IDと発注点別に在庫テーブルの在庫数を足し、在庫テーブルに部品IDがなければ0として計算して、結果がもし発注点より小さければ、定数'必要’、そうでなければ定数'不要’を出力しなさい。
問25 | 目次 | 問27 |