今回の課題・得点と最高完了得点をこのブラウザに保存します。SQL入力・実行結果・教材DBへの変更は再読み込みで戻ります。誤答やヒントによる減点はありません。
最高完了得点: 0 / 90pt
総合 — JOIN × GROUP BY で売上を出す
中級約14分3問
これまでの 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;
教材DBを初期化中...
SQL エディタCtrl / ⌘ + Enter で実行 · Esc → Tab で移動
結果は1000行まで・実行は30秒まで。中止・リセットは教材への変更だけを破棄し、入力SQLと進捗は残します。
教材DBを初期化しています。
SQL を入力して実行してください
練習問題 — 0/3 完了 (0/90pt)
▶30pt
orders と products を JOIN して、カテゴリ別の売上 (SUM(price × quantity)) を「カテゴリ・売上」で取得してください。
列の順序: category → 別名自由。行の順序は自由です。
○30pt
orders と customers を JOIN して、2 回以上注文した顧客の名前と注文回数を取得してください(HAVING を使う)。
○30pt
3 テーブルを JOIN して、顧客ごとの購入総額 (SUM(price × quantity)) を「顧客名・総額」で取得してください。