総合 — JOIN × GROUP BY で売上を出す

中級143

これまでの 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 と集計を

組み合わせる 一番の狙いです。

リピーターを抽出する(HAVING)

「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;

データベースを初期化中...
SQL エディタCtrl+Enter で実行
SQL を入力して実行してください
練習問題 — 0/3 完了 (0/90pt)
orders と products を JOIN して、カテゴリ別の売上 (SUM(price × quantity)) を「カテゴリ・売上」で取得してください。
30pt
orders と customers を JOIN して、2 回以上注文した顧客の名前と注文回数を取得してください(HAVING を使う)。
30pt
3 テーブルを JOIN して、顧客ごとの購入総額 (SUM(price × quantity)) を「顧客名・総額」で取得してください。
30pt