Retail Banking Operations Path · Mission 20 of 30Hard

Cross-sell candidate model: cash-back card

Multi-table EXISTS / NOT EXISTS + scoring + LIMIT

The Brief

Sarah ReyesCustomer Insights Leadretail-ops

Q2 cash-back card campaign. I need the top 25 candidate customers — currently checking-only, not already on a credit card with us, FICO ≥ 680 (the floor underwriting will approve at), and Active status. From `retail_customers` joined through `retail_accounts` and `retail_products`. Output `customer_id`, `first_name`, `last_name`, `fico_current`, `estimated_income`, `segment`. Rank by `estimated_income` descending — higher-income transactors are the highest-value cash-back card targets. Limit 25.

You'll practice

EXISTS / NOT EXISTSEligibility scoring

Tables & columns available

retail_customersdim13 columns
ColumnTypeKey
customer_idINTPK
household_idTEXT
first_nameTEXT
last_nameTEXT
date_of_birthTEXT
stateTEXT
segmentTEXT
fico_currentINT
estimated_incomeREAL
kyc_riskTEXT
acquisition_channelTEXT
onboarded_dateTEXT
statusTEXT
retail_accountsdim13 columns
ColumnTypeKey
account_idINTPK
customer_idINTFK → retail_customers
product_idINTFK → retail_products
branch_idINTFK → retail_branches
open_dateTEXT
close_dateTEXT
statusTEXT
ownership_typeTEXT
interest_rateREAL
original_balanceREAL
credit_limitREAL
fico_at_origINT
maturity_dateTEXT
retail_productsdim10 columns
ColumnTypeKey
product_idINTPK
product_codeTEXT
product_nameTEXT
categoryTEXT
subcategoryTEXT
default_aprREAL
default_apyREAL
monthly_feeREAL
nsf_feeREAL
od_feeREAL

Hints (3)

Each hint you reveal reduces the XP you can earn. Try the query first.

Hint 1

Two filters in one query are tricky: the customer must HAVE an open Checking account AND must NOT have any Credit Card account. EXISTS for the positive case, NOT EXISTS for the negative case — both correlated subqueries on the same `retail_accounts`.

Hint 2

Or use a CTE that aggregates per customer: `BOOL_OR(p.subcategory = 'Checking') AS has_checking`, `BOOL_OR(p.subcategory = 'Credit Card') AS has_card`, then filter `has_checking AND NOT has_card` in the outer SELECT.

Hint 3

Apply the FICO floor and Active-status filter from the briefing. ORDER BY estimated_income descending, then LIMIT to the campaign cap. Six columns in the briefing's order.