Intermediate Case 28 of 50

Case 028: The High-Value Customers

customersorderspayments

ByteMart's queries are getting complex enough that Alex starts naming intermediate steps instead of nesting subqueries. The manager is back with a follow-up.

"Same question as before — who's spent over $20,000 — but I'll need this report every week, so could you make it something we can actually read back later?"

The data Alex is looking at

customers
idnamecountrysignup_date
1SamGermany2026-01-02
2NinaCanada2026-01-05
3DavidGermany2026-01-10
4MayaJapan2026-01-15
5DanielCanada2026-01-20
… 5 more rows
orders
idcustomer_idorder_date
10112026-01-05
10222026-01-08
10332026-01-12
10412026-01-20
10542026-02-01
… 23 more rows
payments
idorder_idamount
6011016200
6021023500
6031033600
60410460000
60510512000
… 23 more rows
TASK

Help Alex answer the manager:

“Using a CTE, display each customer’s name and total spending for customers who spent more than $20,000.”
SQL editor Ctrl+Enter to run
Write a query above and hit Run to see what comes back.
No hints requested yet — click "Get a hint" when you're stuck.
Alex's final query — this is for reference. Copy it into your own thinking, not into the editor above.
WITH customer_totals AS ( SELECT orders.customer_id, SUM(payments.amount) AS total FROM orders JOIN payments ON payments.order_id = orders.id GROUP BY orders.customer_id ) SELECT customers.name, customer_totals.total FROM customer_totals JOIN customers ON customers.id = customer_totals.customer_id WHERE customer_totals.total > 20000 ORDER BY customer_totals.total DESC;
What that query returns
Case Debrief CTE (WITH clause)
  • CTE stands for Common Table Expression. WITH name AS (...) defines a named, reusable result set for the rest of the query — the same power as a subquery, but far more readable once queries get complex.

Case closed.

Ready for the next one?

Next: Case 029 — The Second Order →