The Category of Each Member in the Store - Problem
A retail store wants to implement a member loyalty system that categorizes customers based on their shopping behavior. The store tracks member information, visit dates, and purchase data across three interconnected tables.
Your task is to calculate conversion rates and assign appropriate membership tiers:
- Diamond: Conversion rate ≥ 80% (Premium shoppers)
- Gold: Conversion rate ≥ 50% and < 80% (Regular buyers)
- Silver: Conversion rate < 50% (Window shoppers)
- Bronze: Never visited the store (Inactive members)
The conversion rate is calculated as: (100 × total purchases) ÷ total visits
You need to write a SQL query that joins the three tables, calculates conversion rates for each member, and returns their member_id, name, and assigned category.
Input & Output
example_1.sql — Basic member categorization
$
Input:
Members: [(1,'Alice'), (2,'Bob'), (3,'Charlie')]
Visits: [(101,1,'2021-01-01'), (102,1,'2021-01-02'), (103,2,'2021-01-03')]
Purchases: [(101,20), (103,30)]
›
Output:
[(1,'Alice','Gold'), (2,'Bob','Diamond'), (3,'Charlie','Bronze')]
💡 Note:
Alice: 2 visits, 1 purchase → 50% conversion (Gold). Bob: 1 visit, 1 purchase → 100% conversion (Diamond). Charlie: 0 visits → Bronze.
example_2.sql — High conversion members
$
Input:
Members: [(4,'Diana'), (5,'Eve')]
Visits: [(104,4,'2021-02-01'), (105,4,'2021-02-02'), (106,4,'2021-02-03'), (107,4,'2021-02-04'), (108,4,'2021-02-05'), (109,5,'2021-02-06')]
Purchases: [(104,50), (105,75), (106,100), (107,25), (109,200)]
›
Output:
[(4,'Diana','Diamond'), (5,'Eve','Diamond')]
💡 Note:
Diana: 5 visits, 4 purchases → 80% conversion (Diamond). Eve: 1 visit, 1 purchase → 100% conversion (Diamond).
example_3.sql — Low conversion edge case
$
Input:
Members: [(6,'Frank')]
Visits: [(110,6,'2021-03-01'), (111,6,'2021-03-02'), (112,6,'2021-03-03'), (113,6,'2021-03-04'), (114,6,'2021-03-05')]
Purchases: [(110,10)]
›
Output:
[(6,'Frank','Silver')]
💡 Note:
Frank: 5 visits, 1 purchase → 20% conversion rate, which is less than 50%, so he gets Silver category.
Constraints
- 1 ≤ member_id ≤ 105
- 1 ≤ visit_id ≤ 106
- 1 ≤ charged_amount ≤ 104
- All member_id values in Members table are unique
- All visit_id values in Visits table are unique
- visit_date is a valid date in YYYY-MM-DD format
- A visit can have at most one purchase (visit_id appears at most once in Purchases)
- member_id in Visits table always references a valid member in Members table
Visualization
Tap to expand
Understanding the Visualization
1
Join Member Data
Connect member profiles with their visit history using LEFT JOIN
2
Track Purchases
Link visits to actual purchases to calculate conversion success
3
Calculate Conversion
Apply formula: (100 × purchases) ÷ visits for each member
4
Assign Categories
Award membership tiers: Diamond (≥80%), Gold (≥50%), Silver (<50%), Bronze (no visits)
Key Takeaway
🎯 Key Insight: Use LEFT JOINs to preserve all members (including inactive ones) while efficiently calculating conversion rates in a single database query.
💡
Explanation
AI Ready
💡 Suggestion
Tab
to accept
Esc
to dismiss
// Output will appear here after running code