IPA過去問ドリル

平成24年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9

テクノロジ/データベース

ある月の“月末商品在庫”表と“当月商品出荷実績”表を使って,ビュー“商品別出荷実績”を定義した。このビューにSQL文を実行した結果の値はどれか。 月末商品在庫 商品コード:S001,商品名:A,在庫数:100 商品コード:S002,商品名:B,在庫数:250 商品コード:S003,商品名:C,在庫数:300 商品コード:S004,商品名:D,在庫数:450 商品コード:S005,商品名:E,在庫数:200 当月商品出荷実績 商品コード:S001,商品出荷日:2012-03-01,出荷数:50 商品コード:S003,商品出荷日:2012-03-05,出荷数:150 商品コード:S001,商品出荷日:2012-03-10,出荷数:100 商品コード:S005,商品出荷日:2012-03-15,出荷数:100 商品コード:S005,商品出荷日:2012-03-20,出荷数:250 商品コード:S003,商品出荷日:2012-03-25,出荷数:150 (注:本サイトでは原問題の表を文字表記に変換しています) 〔ビュー“商品別出荷実績”の定義〕 CREATE VIEW 商品別出荷実績(商品コード,出荷実績数,月末在庫数) AS SELECT 月末商品在庫.商品コード,SUM(出荷数),在庫数 FROM 月末商品在庫 LEFT OUTER JOIN 当月商品出荷実績 ON 月末商品在庫.商品コード = 当月商品出荷実績.商品コード GROUP BY 月末商品在庫.商品コード,在庫数 〔SQL文〕 SELECT SUM(月末在庫数) AS 出荷商品在庫合計 FROM 商品別出荷実績 WHERE 出荷実績数 <= 300

出典:平成24年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9

正解:ア

解説

ビュー“商品別出荷実績”は,“月末商品在庫”と“当月商品出荷実績”を商品コードでLEFT OUTER JOINし,商品コードと在庫数でグループ化して,商品コードごとの出荷数の合計(出荷実績数)と在庫数(月末在庫数)を求めるものである。LEFT OUTER JOINにより,当月に出荷実績のない商品(S002,S004)については,出荷実績数がNULLとなる。集計すると,S001は出荷実績数150・月末在庫数100,S002はNULL・250,S003は300・300,S004はNULL・450,S005は350・200となる。この上で,SQL文「WHERE 出荷実績数 <= 300」を適用すると,NULLとの比較結果は真にならないためS002・S004は除外され,S005は出荷実績数350が300を超えるため除外される。条件を満たすのはS001(月末在庫数100)とS003(月末在庫数300)であり,これらのSUM(月末在庫数)は100+300=400となる。

選択肢ごとの解説

  • 正しい。条件(出荷実績数<=300)を満たすのはS001(月末在庫数100)とS003(月末在庫数300)であり,その月末在庫数の合計は100+300=400である。
  • 誤り。出荷実績数がNULLとなるS002・S004や,出荷実績数が300を超えるS005を誤って集計に含めるなどしない限り,合計が500になることはない。
  • 誤り。全ての商品の月末在庫数(100+250+300+450+200=1300)や,NULLを除外しない誤った集計などを行わない限り,合計が600になることはない。
  • 誤り。条件を満たさない商品(出荷実績数がNULLのS002・S004,又は300を超えるS005)まで合計に含めてしまうと,このような大きい値になり得るが,正しく絞り込んだ場合の合計は400である。
データベーススペシャリストの過去問を演習モードで解く