この記事の概要
- この記事は「達人に学ぶSQL徹底指南書/ミック著」の演習問題をブラウザのSQL実行環境(db-fiddle.com)で動かしてみたというものになります。
- 解説は書籍の方を参照してください。
- カラム名がアルファベット表記になっていることに注意してください
db-fiddle.comの使い方
- テーブルの作成: Scheme SQLの欄にCREATE TABLEを書いてテーブルを作成
- データの挿入: Query SQLの欄にINSERT文を書いてデモデータを挿入する
- データの検索: Query SQLの欄にSELCT文を書く
問題文
「『関係除算でバスケット解析』(p73)では、条件を店舗だけを結果として選択しました。
しかし、要件によっては、品物を全て揃えていなかった店舗についても『どれぐらいの品物が不足していたのか』
を一覧表示したいこともあるでしょう。
そこで、先の関係除算のクエリを、次のように全店舗について結果を一覧表示するよう変更してください。my_item_cntは店舗の現在在庫数、
diff_cntは、足りなかった商品の数を表しています。」
- 出典: p80, 達人に学ぶSQL徹底指南書, 第1版
データセットの準備
- Schema SQL
CREATE TABLE Items(
item varchar(255) NOT NULL
);
CREATE TABLE ShopItems(
shop varchar(255) NOT NULL,
item varchar(255) NOT NULL
);
- Query SQL
INSERT INTO Items VALUES
('beer'),
('omutu'),
('bicycle');
INSERT INTO ShopItems VALUES
('sendai', 'beer'),
('sendai', 'omutu'),
('sendai', 'bicycle'),
('sendai', 'curtail'),
('tokyo', 'beer'),
('tokyo', 'omutu'),
('tokyo', 'bicycle'),
('osaka', 'TV'),
('osaka', 'omutu'),
('osaka', 'bicycle');
解答
詳しい解説は書籍を参照してください。
SELECT
SI.shop,
COUNT(*) AS my_item_cnt,
(SELECT COUNT(item) FROM Items) - COUNT(SI.item) AS diff_cnt
FROM ShopItems SI, Items I
WHERE SI.item = I.item
GROUP BY SI.shop;