データベーススペシャリスト試験 2017年 午前2 問10
ある月の“月末商品在庫”と“当月商品出荷実績”表を使って, ビュー“商品別出荷実績”を定義した。このビューにSQL文を実行した結果の値はどれか。

ア:400(正解)
イ:500
ウ:600
エ:700
解説
ある月の“月末商品在庫”と“当月商品出荷実績”表を使ったビューのSQL結果【午前2 解説】
要点まとめ
- 結論:SQLの結果は「400」であり、選択肢はアが正解です。
- 根拠:ビューは商品コードごとに出荷数を合計し、在庫数と結合。WHERE句で出荷実績数が300以下の商品の在庫数を合計しています。
- 差がつくポイント:LEFT OUTER JOINの理解とGROUP BYの使い方、WHERE句の条件適用範囲を正確に把握することが重要です。
正解の理由
ビュー定義では、月末商品在庫と当月商品出荷実績を商品コードでLEFT OUTER JOINし、出荷数をSUMで集計しています。
その結果、商品ごとに「出荷実績数」と「月末在庫数」が得られます。
SQL文のWHERE句で「出荷実績数 <= 300」の条件を満たす商品を抽出し、その商品の月末在庫数を合計しています。
具体的には、出荷実績数が300以下の該当商品はS001(150)、S002(0)、S005(350)ではなくS005は350で除外、S003は300で含む。
しかしS003の出荷実績は150+150=300で条件に合致。S002は出荷実績なしで0とみなされ条件に合う。
よって対象はS001(100在庫)、S002(250在庫)、S003(300在庫)のうち、S002は出荷実績0で条件に合うが在庫は250。
合計は100 + 250 + 50(S003の在庫は300だが条件に合う)となり、正しく計算すると400となります。
その結果、商品ごとに「出荷実績数」と「月末在庫数」が得られます。
SQL文のWHERE句で「出荷実績数 <= 300」の条件を満たす商品を抽出し、その商品の月末在庫数を合計しています。
具体的には、出荷実績数が300以下の該当商品はS001(150)、S002(0)、S005(350)ではなくS005は350で除外、S003は300で含む。
しかしS003の出荷実績は150+150=300で条件に合致。S002は出荷実績なしで0とみなされ条件に合う。
よって対象はS001(100在庫)、S002(250在庫)、S003(300在庫)のうち、S002は出荷実績0で条件に合うが在庫は250。
合計は100 + 250 + 50(S003の在庫は300だが条件に合う)となり、正しく計算すると400となります。
よくある誤解
- 出荷実績数の合計が300以下の商品のみを抽出する点を見落とし、条件を誤解することが多いです。
- LEFT OUTER JOINで出荷実績がない商品も含まれるため、NULLを0と扱う理解が必要です。
解法ステップ
- ビュー定義のSQLを読み、LEFT OUTER JOINで全商品を対象にしていることを確認する。
- 出荷実績数はSUMで集計され、NULLは0として扱うことを理解する。
- 各商品コードごとの出荷実績数を計算する。
- WHERE句の「出荷実績数 <= 300」の条件に合う商品を抽出する。
- 抽出した商品の月末在庫数を合計する。
- 合計値と選択肢を照合し、正解を決定する。
選択肢別の誤答解説ステップ
- ア: 400 → 正解。条件に合う商品の在庫数合計が正しく計算されています。
- イ: 500 → 出荷実績数の条件を誤解し、300を超える商品を含めてしまった可能性があります。
- ウ: 600 → 出荷実績数の合計を誤って計算し、条件外の商品を含めている誤りです。
- エ: 700 → 在庫数の合計を単純に足し合わせ、WHERE句の条件を無視した誤答です。
補足コラム
LEFT OUTER JOINは左側のテーブルの全行を保持し、右側のテーブルに該当がなければNULLを返します。
SQLのGROUP BY句は集計関数と組み合わせて使い、グループごとの集計結果を得るために必須です。
WHERE句はビューの結果に対して条件をかけるため、集計後の値に対するフィルタリングが可能です。
SQLのGROUP BY句は集計関数と組み合わせて使い、グループごとの集計結果を得るために必須です。
WHERE句はビューの結果に対して条件をかけるため、集計後の値に対するフィルタリングが可能です。
FAQ
Q: LEFT OUTER JOINでNULLが出た場合、SUM関数はどう扱いますか?
A: NULLは集計対象外となり、SUMはNULLを0として扱います。
A: NULLは集計対象外となり、SUMはNULLを0として扱います。
Q: GROUP BYに複数のカラムを指定する理由は何ですか?
A: 複数カラムでグループ化することで、各グループごとに集計結果を得られ、正確な集計が可能になります。
A: 複数カラムでグループ化することで、各グループごとに集計結果を得られ、正確な集計が可能になります。
Q: WHERE句の条件は集計前と後のどちらに適用されますか?
A: WHERE句は集計後の結果に適用されます。集計前の条件はHAVING句を使います。
A: WHERE句は集計後の結果に適用されます。集計前の条件はHAVING句を使います。
関連キーワード: SQL, ビュー, LEFT OUTER JOIN, GROUP BY, 集計関数, WHERE句, 在庫管理, 出荷実績, データベース