runtime
21 / 88

lesson 21 Joins & sets · intermediate

Revenue across tables

Calculate revenue while joining orders and related records.

the idea

Join transaction rows to product prices, multiply price by quantity, then aggregate at the desired grain. Filter status before computing paid revenue.

tables in this lesson

The challenges use this data. Each column shows its type underneath; → marks a link to another table.

customers4 columns · 8 rows
idinteger · keynametextcitytextjoined_attext
1AliceChicago2024-01-10
2BenAustin2024-02-12
3CaraSeattle2024-03-05
4DevChicago2024-04-20
5ElenaNULL2024-05-01

showing 5 of 8 rows

products4 columns · 6 rows
idinteger · keynametextcategorytextpricereal
1NotebookStationery12
2Desk lampHome45
3KeyboardTech80
4Pen setStationery8
5HeadphonesTech120

showing 5 of 6 rows

orders6 columns · 12 rows
idinteger · keycustomer_idintegerproduct_idintegerquantityintegerstatustextordered_attext
101112paid2025-01-01
102231paid2025-01-02
103121paid2025-01-05
104352pending2025-01-08
105445paid2025-02-01

showing 5 of 12 rows

example

The idea in one query. Press Run to see what it returns; running examples never affects your progress.

example.sql
SELECT c.name, SUM(o.quantity * p.price) AS revenue
FROM orders o
JOIN customers c ON c.id=o.customer_id
JOIN products p ON p.id=o.product_id
WHERE o.status='paid'
GROUP BY c.id,c.name;

Watch for: Summing price without quantity undercounts multi-unit orders.

build it step by step

Each step changes one thing. Run them in order and watch the result change.

  1. Read an order line with its price. Join one order line to its product so quantity and price sit on the same row. The next step multiplies them and aggregates paid revenue.

    step-1.sql
    SELECT o.id, o.quantity, p.price, o.status
    FROM orders o
    JOIN products p ON p.id = o.product_id
    LIMIT 8;
  2. Run the reference. Join transaction rows to product prices, multiply price by quantity, then aggregate at the desired grain. Filter status before computing paid revenue.

    step-2.sql
    SELECT c.name, SUM(o.quantity * p.price) AS revenue
    FROM orders o
    JOIN customers c ON c.id=o.customer_id
    JOIN products p ON p.id=o.product_id
    WHERE o.status='paid'
    GROUP BY c.id,c.name;

challenge 1

Show customer name and paid revenue (alias revenue), only customers with paid orders.

Return namerevenueany row order

challenge-1.sql
 
To master this lesson, solve both challenges without hints and pass the concept check. 3 of 3 to go.