導入
「どの商品がいちばん売れているか」「売上の総額は」――ショップを運営するなら真っ先に知りたい数字です。売上は order_items(何が何個売れたか)と products(単価)をつなぎ、掛けて、足し上げれば出ます。JOIN + 集計の総合力の見せどころです。
説明
売上 = 「注文明細の数量 × 商品の単価」を、商品ごとに合計します。明細 order_items に単価は無いので、products を JOIN して価格を引いてきます。
flowchart LR
OI["order_items<br/>product_id・quantity"] -->|"JOIN product_id = id"| P["products<br/>price"]
P --> C["quantity × price を<br/>商品ごとに SUM"]
SELECT p.name,
SUM(oi.quantity) AS 販売数,
SUM(oi.quantity * p.price) AS 売上
FROM order_items oi
JOIN products p ON oi.product_id = p.id
GROUP BY p.id
ORDER BY 売上 DESC;
SUM(oi.quantity * p.price) が「行ごとの小計(数量×単価)を、グループ内で足し上げる」計算です。GROUP BY p.id で商品ごとにまとめ、ORDER BY 売上 DESC で売れている順に並べています。ノートPC(128000円)が数量は少なくても売上で上位に来るはずです。
やってみよう
初期表示のクエリを実行し、商品別の販売数と売上ランキングを確認しましょう。次に、WHERE で対象を絞ったり、ORDER BY 販売数 DESC に変えて「数量ベースの人気順」も見てみてください。
演習
同じ要領で、カテゴリ別の売上を出してください。order_items → products → categories と JOIN でつなぎ、categories.name ごとに SUM(oi.quantity * p.price) を売上として集計、売上の高い順に並べます。取り出す列はカテゴリ名と売上(別名 売上)。
ヒント1を見る
JOIN products p ON oi.product_id = p.id JOIN categories c ON p.category_id = c.id の2段でつなぎ、GROUP BY c.id します。
ヒント2を見る
SELECT c.name, SUM(oi.quantity * p.price) AS 売上 FROM order_items oi JOIN products p ON oi.product_id = p.id JOIN categories c ON p.category_id = c.id GROUP BY c.id ORDER BY 売上 DESC;