令和3年度 春期 システムアーキテクト試験 午前Ⅱ 問24

ある月の“月末商品在庫”表と“当月商品出荷実績”表を使って,ビュー“商品別出荷実績”を定義した。このビューにSQL文を実行した結果の値はどれか。

月末商品在庫
図の説明テキスト
商品コード 商品名 在庫数
S001 A 100
S002 B 250
S003 C 300
S004 D 450
S005 E 200
当月商品出荷実績
図の説明テキスト
商品コード 商品出荷日 出荷数
S001 2021-03-01 50
S003 2021-03-05 150
S001 2021-03-10 100
S005 2021-03-15 100
S005 2021-03-20 250
S003 2021-03-25 150
〔ビュー “商品別出荷実績” の定義〕
図の説明テキスト
CREATE VIEW 商品別出荷実績 (商品コード, 出荷実績数, 月末在庫数)
AS SELECT 月末商品在庫.商品コード, SUM (出荷数), 在庫数
FROM 月末商品在庫 LEFT OUTER JOIN 当月商品出荷実績
ON 月末商品在庫.商品コード = 当月商品出荷実績.商品コード
GROUP BY 月末商品在庫.商品コード, 在庫数
〔SQL文〕
図の説明テキスト
SELECT SUM (月末在庫数) AS 出荷商品在庫合計
FROM 商品別出荷実績 WHERE 出荷実績数 <= 300
解答・解説

正解: ア. 400

ビューの定義と、そのビューに対して実行されるSQL文の処理を順を追って確認します。

1. ビュー「商品別出荷実績」の生成

ビューの定義にあるSQL文では、「月末商品在庫」表と「当月商品出荷実績」表を商品コードで LEFT OUTER JOIN(左外部結合) し、商品コードごとにグループ化(GROUP BY)して、出荷数の合計(SUM(出荷数))を求めています。
左外部結合であるため、出荷実績がない商品も結果に含まれ、その場合の出荷実績数の合計は NULL となります。

各商品の「出荷実績数」と「月末在庫数」を計算すると、以下のようになります。

  • S001:出荷数 50+100=15050 + 100 = 150、月末在庫数 100
  • S002:出荷実績なしのため NULL、月末在庫数 250
  • S003:出荷数 150+150=300150 + 150 = 300、月末在庫数 300
  • S004:出荷実績なしのため NULL、月末在庫数 450
  • S005:出荷数 100+250=350100 + 250 = 350、月末在庫数 200

2. 条件による絞り込みと集計

次に、生成したビューに対して以下のSQL文を実行します。

SELECT SUM (月末在庫数) AS 出荷商品在庫合計
FROM 商品別出荷実績 WHERE 出荷実績数 <= 300

WHERE 出荷実績数 <= 300 の条件を満たすか、各商品について判定します。

  • S001(出荷実績数 150):150≦300150 \leqq 300 のため 条件を満たす
  • S002(出荷実績数 NULL):NULL に対する比較演算は「Unknown(不定)」となり、条件を満たさない(除外される)
  • S003(出荷実績数 300):300≦300300 \leqq 300 のため 条件を満たす
  • S004(出荷実績数 NULL):条件を満たさない(除外される)
  • S005(出荷実績数 350):350≦300350 \leqq 300 ではないため 条件を満たさない(除外される)

条件を満たすのは S001 と S003 です。
この2つの商品の「月末在庫数」の合計(SUM(月末在庫数))を計算します。

  • 100(S001)+300(S003)=400100 (\text{S001}) + 300 (\text{S003}) = 400

実行結果の値は 400 となるため、ア が正解です。

各選択肢の解説

  • ア:正解です。
  • イ:誤りです。出荷実績数が300以上である商品(S003、S005)の月末在庫数を合計した場合の値(300+200=500300 + 200 = 500)です。
  • ウ:誤りです。条件に関係なく、出荷実績が存在するすべての中の商品(S001、S003、S005)の月末在庫数を合計した場合の値(100+300+200=600100 + 300 + 200 = 600)です。
  • エ:誤りです。出荷実績が存在しない商品(S002、S004)の月末在庫数を合計した場合の値(250+450=700250 + 450 = 700)です。

Spineチーム