令和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 月末商品在庫.商品コード, 在庫数

図の説明テキスト
SELECT SUM (月末在庫数) AS 出荷商品在庫合計
FROM 商品別出荷実績 WHERE 出荷実績数 <= 300
解答・解説
正解: ア. 400
ビューの定義と、そのビューに対して実行されるSQL文の処理を順を追って確認します。
1. ビュー「商品別出荷実績」の生成
ビューの定義にあるSQL文では、「月末商品在庫」表と「当月商品出荷実績」表を商品コードで LEFT OUTER JOIN(左外部結合) し、商品コードごとにグループ化(GROUP BY)して、出荷数の合計(SUM(出荷数))を求めています。
左外部結合であるため、出荷実績がない商品も結果に含まれ、その場合の出荷実績数の合計は NULL となります。
各商品の「出荷実績数」と「月末在庫数」を計算すると、以下のようになります。
- S001:出荷数 、月末在庫数 100
- S002:出荷実績なしのため
NULL、月末在庫数 250 - S003:出荷数 、月末在庫数 300
- S004:出荷実績なしのため
NULL、月末在庫数 450 - S005:出荷数 、月末在庫数 200
2. 条件による絞り込みと集計
次に、生成したビューに対して以下のSQL文を実行します。
SELECT SUM (月末在庫数) AS 出荷商品在庫合計
FROM 商品別出荷実績 WHERE 出荷実績数 <= 300
WHERE 出荷実績数 <= 300 の条件を満たすか、各商品について判定します。
- S001(出荷実績数 150): のため 条件を満たす
- S002(出荷実績数
NULL):NULLに対する比較演算は「Unknown(不定)」となり、条件を満たさない(除外される) - S003(出荷実績数 300): のため 条件を満たす
- S004(出荷実績数
NULL):条件を満たさない(除外される) - S005(出荷実績数 350): ではないため 条件を満たさない(除外される)
条件を満たすのは S001 と S003 です。
この2つの商品の「月末在庫数」の合計(SUM(月末在庫数))を計算します。
実行結果の値は 400 となるため、ア が正解です。
各選択肢の解説
- ア:正解です。
- イ:誤りです。出荷実績数が300以上である商品(S003、S005)の月末在庫数を合計した場合の値()です。
- ウ:誤りです。条件に関係なく、出荷実績が存在するすべての中の商品(S001、S003、S005)の月末在庫数を合計した場合の値()です。
- エ:誤りです。出荷実績が存在しない商品(S002、S004)の月末在庫数を合計した場合の値()です。