今回の課題・得点と最高完了得点をこのブラウザに保存します。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)
▶
orders と products を JOIN して、カテゴリ別の売上 (SUM(price × quantity)) を「カテゴリ・売上」で取得してください。
列の順序: category → 別名自由。行の順序は自由です。
30pt
○
orders と customers を JOIN して、2 回以上注文した顧客の名前と注文回数を取得してください(HAVING を使う)。
30pt
○
3 テーブルを JOIN して、顧客ごとの購入総額 (SUM(price × quantity)) を「顧客名・総額」で取得してください。
30pt