SQL QuestSQL Interview Questions › Subqueries & CTEs

Spend and Disputes Per Cardholder — Without the Fan-Out

MediumFreeQuerying BasicsSubqueries & CTEsJoinsAggregation & Grouping

This is the mistake a card screen is built to catch. An account has many transactions AND many chargebacks. Join all three tables in one chain — accounts JOIN transactions JOIN chargebacks ON account_id — and every transaction row is repeated once per chargeback the account has. Account 156 has 11 transactions and 5 chargebacks; the naive query returns 55 rows for it and reports its spend at five times the true figure. Nothing errors. The number is just wrong.

The fix is to never join two one-to-many children of the same parent at row level: aggregate each branch to one row per account first, in its own CTE, then join the summaries.

Return the 20 cardholders with the most disputes: account_id, email, txn_count, total_spend (rounded to 2 decimals) and chargeback_count. Every account has transactions but most have no chargebacks, so that branch is a LEFT JOIN and its NULL becomes 0 — COALESCE(d.chargeback_count, 0). Order by chargeback_count descending, then total_spend descending, then account_id ascending.

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_idemailsignup_atcountrydevice_fingerprintip_blockstatus
1user1@example.com2026-02-24T00:00:00.000ZTRdev_13c0cdad41.116.196.153active
2user2@inbox.dev2025-05-13T00:00:00.000ZJPdev_26576d4938.98.201.102active
3user3@inbox.dev2026-04-25T00:00:00.000ZJPdev_42f1a115190.77.45.244flagged

transactions

txn_idaccount_idamounttxn_atmerchant_idlatlngstatus
1149151.842026-03-04T12:39:39.078Z2440.342-74.4092completed
22110.722026-03-04T13:04:50.641Z752.936613.3229completed
335158.782026-03-04T13:27:15.528Z2552.739713.3134completed

chargebacks

chargeback_idtxn_idaccount_idmerchant_idreason_codeopened_atresolved_atstatusrelated_chargeback_id
1816010service_not_received2026-03-06T16:52:17.429Z2026-04-06T16:52:17.429ZsplitNULL
21644216fraud_card_not_present2026-03-16T23:50:46.792Z2026-04-22T23:50:46.792Zopen1
31724820fraud_card_present2026-03-12T05:22:57.195Z2026-04-14T05:22:57.195Zcardholder_won2

Expected output: 156 user156@example.com 11 7190.81 5; 17 user17@mail.test 24 9170.65 4; ...

Hint

The hint for this one spells out most of the query, so it stays in the editor. Reach for SELECT, CTE, JOIN, and open the hint there if you stall.

Concepts

SELECT CTE JOIN LEFT JOIN GROUP BY SUM Multi-CTE

Practise the topic: SQL practice questions · CTE practice · JOIN practice · GROUP BY exercises

In these company practice sets

Capital One · Plaid

A SQL Quest challenge matched to patterns reported for these companies — not a question any of them has published.

Related questions

Department Roster with GROUP_CONCATMedium · FreeConsistent Director AnalysisMedium · FreeBelow Department AverageMedium · FreeHighest Total Salary Budget DepartmentMedium · FreeFare Imputation AnalysisMedium · FreeUNION ALL Dedup: Cross-Dataset SearchMedium · Free

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