SQL Quest › SQL Interview Questions › Joins
Cards That Never Spend at Home
"Never" is a statement about a whole group, so it cannot live in a WHERE clause. WHERE decides one row at a time. WHERE m.country <> a.country answers a different question — "has at least one foreign transaction" — and in this ledger that is almost everybody: 1,715 of 2,165 transactions cross a border.
The cards worth looking at are the ones that have never transacted at a merchant in the cardholder's own country. Express it as a condition on the group: count the home-country transactions with a conditional SUM and require that count to be zero in HAVING.
Return account_id, email, country (the cardholder's), txn_count, merchant_countries (distinct merchant countries they used) and total_spend (rounded to 2 decimals). 24 accounts qualify. Order by txn_count descending, then account_id ascending.
The filter must be HAVING SUM(CASE WHEN m.country = a.country THEN 1 ELSE 0 END) = 0 — a count of the rows you do NOT want, required to be zero. Filtering those rows out with WHERE first would delete the evidence you are testing for and every account would pass.
Solve it in the browser editor →
Runs on SQLite in your browser, graded against the expected result, no signup. A wrong answer gets a diagnosis, not just "incorrect".
Schema
accounts
| account_id | signup_at | country | device_fingerprint | ip_block | status | |
|---|---|---|---|---|---|---|
| 1 | user1@example.com | 2026-02-24T00:00:00.000Z | TR | dev_13c0cdad | 41.116.196.153 | active |
| 2 | user2@inbox.dev | 2025-05-13T00:00:00.000Z | JP | dev_26576d49 | 38.98.201.102 | active |
| 3 | user3@inbox.dev | 2026-04-25T00:00:00.000Z | JP | dev_42f1a115 | 190.77.45.244 | flagged |
transactions
| txn_id | account_id | amount | txn_at | merchant_id | lat | lng | status |
|---|---|---|---|---|---|---|---|
| 1 | 149 | 151.84 | 2026-03-04T12:39:39.078Z | 24 | 40.342 | -74.4092 | completed |
| 2 | 21 | 10.72 | 2026-03-04T13:04:50.641Z | 7 | 52.9366 | 13.3229 | completed |
| 3 | 35 | 158.78 | 2026-03-04T13:27:15.528Z | 25 | 52.7397 | 13.3134 | completed |
merchants
| merchant_id | name | category | country | risk_tier |
|---|---|---|---|---|
| 1 | BigBox Mart | Grocery | TR | high |
| 2 | Quick Stop | Electronics | JP | high |
| 3 | Aurora Cafe | Travel | TR | high |
Expected output: 188 user188@example.com JP 18 4 4457.79; 20 user20@inbox.dev JP 13 4 1357.35; ...
Hint
Concepts
SELECT JOIN GROUP BY HAVING CASE COUNT DISTINCT GROUP BY + HAVING
Practise the topic: SQL practice questions · JOIN practice · GROUP BY exercises · CASE WHEN practice · Advanced SQL interview questions
In these company practice sets
A SQL Quest challenge matched to patterns reported for these companies — not a question any of them has published.
Related questions
Where would this cost you points in an interview?
Ten questions, no signup: a Skillmap across nine SQL skills and the one to fix first.
Take the readiness test