Intermediate
Case 24 of 50
Case 024: The Running Total
customersorderspayments
Finance wants to see how each customer's spending actually built up over time — not just where they landed, but the running story behind it. The manager brings the request to Alex.
"Could you show me each customer's spending adding up as it happens, order by order? I don't just want the final total — I want to see it grow."
The data Alex is looking at
customers
| id | name | country | signup_date |
|---|---|---|---|
| 1 | Sam | Germany | 2026-01-02 |
| 2 | Nina | Canada | 2026-01-05 |
| 3 | David | Germany | 2026-01-10 |
| 4 | Maya | Japan | 2026-01-15 |
| 5 | Daniel | Canada | 2026-01-20 |
| … 5 more rows | |||
orders
| id | customer_id | order_date |
|---|---|---|
| 101 | 1 | 2026-01-05 |
| 102 | 2 | 2026-01-08 |
| 103 | 3 | 2026-01-12 |
| 104 | 1 | 2026-01-20 |
| 105 | 4 | 2026-02-01 |
| … 23 more rows | ||
payments
| id | order_id | amount |
|---|---|---|
| 601 | 101 | 6200 |
| 602 | 102 | 3500 |
| 603 | 103 | 3600 |
| 604 | 104 | 60000 |
| 605 | 105 | 12000 |
| … 23 more rows | ||
TASK
Help Alex answer the manager:
“For each customer, show every order's date, amount, and running total of spending up to that point, in date order.”
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.
SELECT
customers.name,
orders.order_date,
payments.amount,
SUM(payments.amount) OVER (
PARTITION BY customers.id
ORDER BY orders.order_date
) AS running_total
FROM customers
JOIN orders ON customers.id = orders.customer_id
JOIN payments ON payments.order_id = orders.id
ORDER BY customers.name, orders.order_date;
What that query returns
Case Debrief
SUM() OVER (window running total)
- Adding ORDER BY inside a window turns a flat SUM() into a running total — the same function, two very different behaviors.