Beginner
Case 15 of 50
Case 015: The VIP List
customersorderspayments
The manager is planning a VIP outreach campaign.
"Could you build me one list — anyone who's spent big, or anyone who orders often? Just make sure no one shows up on it twice."
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:
“Build one list of customer names containing everyone who has spent over $50,000 total, or placed 4 or more orders — each name appearing only once.”
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
FROM customers
JOIN orders ON customers.id = orders.customer_id
JOIN payments ON payments.order_id = orders.id
GROUP BY customers.name
HAVING SUM(payments.amount) > 50000
UNION
SELECT customers.name
FROM customers
JOIN orders ON customers.id = orders.customer_id
GROUP BY customers.name
HAVING COUNT(orders.id) >= 4;
What that query returns
Case Debrief
UNION
- UNION stacks the results of two queries and deduplicates automatically.
- Quick tip: UNION ALL does the same stacking but keeps every row, duplicates included. Use it when someone showing up in both queries should genuinely count twice (like totaling revenue) instead of once.