本文へスキップ
BecomeCoder

SQL データ操作 (DML)コース · 第8章 総合演習 · レッスン33

総合演習① ― 売上を集計する

ブラウザで完結

導入

「どの商品がいちばん売れているか」「売上の総額は」――ショップを運営するなら真っ先に知りたい数字です。売上は order_items(何が何個売れたか)と products(単価)をつなぎ、掛けて、足し上げれば出ます。JOIN + 集計の総合力の見せどころです。

説明

売上 = 「注文明細の数量 × 商品の単価」を、商品ごとに合計します。明細 order_items に単価は無いので、productsJOIN して価格を引いてきます。

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_itemsproductscategoriesJOIN でつなぎ、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;

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。