これまでの JOIN・集計・HAVING を組み合わせて、カテゴリ別売上・顧客別購入額・リピーター抽出など実務的な集計を作ります。
中級の締めくくりとして、 これまで学んだ JOIN・GROUP BY・集計関数・HAVING
をまとめて使います。 実務で 一番よく書く形です。
「売上」は 単価 × 数量 です。 単価は products、 数量は orders にあるので、
JOIN して 掛け算し、 カテゴリで まとめます。
SELECT p.category, SUM(p.price * o.quantity) AS sales
FROM orders o
JOIN products p ON p.id = o.product_id
GROUP BY p.category
ORDER BY sales DESC;
- p.price * o.quantity … 1 注文の 金額
- SUM(...) … カテゴリ内で 合計
- GROUP BY p.category … カテゴリごとに まとめる
別テーブルの列どうしを掛けて、集計する — これが JOIN と集計を
組み合わせる 一番の狙いです。
「2 回以上 注文した顧客」のように、 集計した数に条件を付ける ときは HAVING。
SELECT c.name, COUNT(*) AS cnt
FROM orders o
JOIN customers c ON c.id = o.customer_id
GROUP BY c.id
HAVING cnt >= 2;
WHERE では 集計結果 (COUNT) を 条件に できません。 集計の後で 絞るのが HAVING の役割でした。
同じ形で、 顧客軸で 金額を 合計すれば 「顧客別の 購入総額」になります。
SELECT c.name, SUM(p.price * o.quantity) AS total
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_id
GROUP BY c.id
ORDER BY total DESC;