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
🏪 VIP Membership System👤 MembersAlice, BobCharlie🚪 VisitsStore entries& browsing💳 PurchasesActualtransactions📊 Conversion Rate CalculatorRate = (100 × Purchases) ÷ VisitsAlice: 50%Bob: 100%Charlie: 0%🏆 Membership Tiers💎 Diamond (≥80%): Bob🥇 Gold (≥50%): Alice🥈 Silver (<50%): None🥉 Bronze (No visits): Charlie🎯 Key Insight: LEFT JOINs ensure no member is left behind!
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.
Asked in
Amazon 45 Google 38 Meta 32 Microsoft 28
73.9K Views
Medium Frequency
~15 min Avg. Time
1.8K Likes
Ln 1, Col 1
Smart Actions
💡 Explanation
AI Ready
💡 Suggestion Tab to accept Esc to dismiss
// Output will appear here after running code
Code Editor Closed
Click the red button to reopen