2010年 春期 応用情報技術者試験 問6
販売管理システムで使用するSQL文の検証
X社は,輸入インテリアの販売を行っており,全国に店舗を展開している。現在,店舗ごとの受注・出荷は販売管理システムで管理している。新たに,インターネットで販売を行うWebショップを開設することになり,それに合わせて,Webショップでの受注も管理できる販売管理システムを構築することにした。
新システムの開発に当たって,システム部のY君が初めてデータベースの設計・開発を任され,Z係長が指導をすることになった。
[新システムの機能概要]
・Webショップで受注した商品は,顧客の住所を基に在庫のある最寄り店舗から出荷する。
・受注情報には受注店舗の情報をもち,受注明細には出荷店舗の情報をもつ。
・実店舗での販売においては,受注情報と受注明細の店舗は,販売した実店舗とする。
・Webショップでの販売においては,受注情報の店舗はWebショップとし,受注明細の店舗は出荷を行う最寄り店舗とする。
・Webショップも含めた全店舗の売上を,月次で店舗ごとに集計する。
・Webショップで販売した商品の売上については,出荷した実店舗に配分する。したがって,Webショップの売上を,月次で受注明細の出荷店舗ごとに集計する。
・Webショップの店舗番号は"A09999"とする。
[新システムで使用するSQL文の検証]
(1) テーブル設計
Y君は,新システムのデータベースのテーブルを設計した。設計したテーブルの一部を図1に示す。
テーブル名 | 項目 |
---|---|
店舗(店舗番号,店舗名,店舗住所) | |
顧客(顧客コード,氏名,住所,電話番号) | |
受注(受注番号,受注日付,受注店舗番号,顧客コード) | |
受注明細(受注番号,明細番号,商品番号,出荷店舗番号,受注数,受注金額) | |
在庫(商品番号,店舗番号,在庫数) | |
(2) SQL文の作成
Y君は,店舗ごとの売上を月次で集計する図2のSQL文と,Webショップの売上を出荷店舗ごとに月次で集計する図3のSQL文を作成した。":指定月開始日",":指定月終了日"は,それぞれ集計対象月の開始日,終了日を表す埋込み変数である。
SELECT t.店舗番号, t.店舗名, SUM(m.受注金額) AS 金額 FROM (店舗 t INNER JOIN (SELECT j.受注店舗番号, j.受注番号 FROM 受注 j WHERE j.受注日付 BETWEEN :指定月開始日 AND :指定月終了日) p ON t.店舗番号 = p.受注店舗番号) INNER JOIN 受注明細 m ON p.受注番号 = m.受注番号 GROUP BY t.店舗番号, t.店舗名 ORDER BY t.店舗番号
SELECT m.出荷店舗番号, SUM(m.受注金額) AS Web売上分 FROM 受注明細 m, 受注 j WHERE (j.受注店舗番号 = a) AND (b - c) AND (j.受注日付 BETWEEN :指定月開始日 AND :指定月終了日) GROUP BY m.出荷店舗番号 ORDER BY m.出荷店舗番号
(3) テストデータの作成
Y君は,SQL文の検証のためにテストデータを作成した。作成したテストデータのうち,店舗,受注,受注明細の各テーブルのデータを表1~3に示す。
店舗番号 | 店舗名 | 店舗住所 |
---|---|---|
A01001 | 銀座店 | 東京都中央区 |
A01002 | 新宿店 | 東京都新宿区 |
A01003 | 渋谷店 | 東京都渋谷区 |
A03001 | 名古屋店 | 名古屋市千種区 |
A05001 | 難波店 | 大阪市中央区 |
A09999 | Webショップ | 本社 WebSystem |
受注番号 | 受注日付 | 受注店舗番号 | 顧客コード |
---|---|---|---|
50001 | 2010-03-03 | A01002 | 11001 |
50002 | 2010-03-08 | A01001 | 11002 |
50003 | 2010-03-12 | A01002 | 11003 |
50004 | 2010-03-13 | A03001 | 12002 |
50005 | 2010-03-19 | A09999 | 12003 |
50006 | 2010-03-21 | A09999 | 13202 |
50007 | 2010-03-21 | A05001 | 13203 |
50008 | 2010-03-29 | A09999 | 11003 |
受注番号 | 明細番号 | 商品番号 | 出荷店舗番号 | 受注数 | 受注金額 |
---|---|---|---|---|---|
50001 | 1 | 765933 | A01002 | 1 | 50400 |
50001 | 2 | 432879 | A01002 | 2 | 7200 |
50002 | 1 | 102004 | A01001 | 1 | 50000 |
50003 | 1 | 664589 | A01002 | 2 | 25000 |
50003 | 2 | 107013 | A01002 | 1 | 60500 |
50004 | 1 | 432879 | A03001 | 1 | 3600 |
50005 | 1 | 168234 | A01002 | 1 | 113000 |
50006 | 1 | 666028 | A01001 | 1 | 36700 |
50007 | 1 | 293041 | A05001 | 1 | 15000 |
50008 | 1 | 813556 | A01002 | 1 | 120000 |
(4) SQL文の実行
表1~3のテストデータを用いて,指定月開始日を2010年3月1日,指定月終了日を2010年3月31日として図2のSQL文を実行した結果,図4の出力が得られた。
店舗番号 | 店舗名 | 金額 |
---|---|---|
A01001 | 銀座店 | 50000 |
A01002 | 新宿店 | 143100 |
A03001 | 名古屋店 | 3600 |
A05001 | 難波店 | 15000 |
A09999 | Webショップ | 269700 |
Z係長は図4の出力された結果を見て,このSQL文では,集計の対象となる期間にd店舗の場合は,店舗ごとの売上の集計に出力されないことを指摘した。Y君がSQL文を図5のように修正して実行したところ,期待された結果が得られた。
SELECT t.店舗番号, t.店舗名, SUM(m.受注金額) AS 金額
FROM 店舗 t e
(SELECT j.受注店舗番号, j.受注番号 FROM 受注 j
WHERE j.受注日付 BETWEEN :指定月開始日 AND :指定月終了日) p
INNER JOIN 受注明細 m ON p.受注番号 = m.受注番号
ON t.店舗番号 = p.受注店舗番号
GROUP BY t.店舗番号, t.店舗名
ORDER BY t.店舗番号