All problems

Channel Conversion Rates

hardSQLJoinsCASEArithmetic

Kindled's marketing meeting keeps confusing volume with quality. A channel that sends a thousand people and sells to five is worse than one that sends ten and sells to three, and raw purchase counts hide that completely. What settles the argument is each channel's conversion rate: how many of the people it brought in went on to buy, as a percentage of how many it brought in at all. Every channel has to appear, including one that sold nothing — a channel that fails silently is the most expensive kind.

events — one row per tracked action. user_id points at a row in users. event_type is one of signup, view_product, add_to_cart and purchase. event_date is the day the action happened. Nothing guarantees a person produces all four kinds, or any particular number of rows.

id user_id event_type event_date
1 1 signup 2023-05-01
2 1 view_product 2023-05-01
3 1 add_to_cart 2023-05-02
4 1 purchase 2023-05-03
5 2 signup 2023-05-02
6 2 view_product 2023-05-02
7 3 signup 2023-05-03
8 3 view_product 2023-05-03
9 3 add_to_cart 2023-05-04
10 4 signup 2023-05-04
11 4 view_product 2023-05-05
12 4 add_to_cart 2023-05-05
13 4 purchase 2023-05-06
14 5 signup 2023-05-05
15 6 signup 2023-05-06
16 6 view_product 2023-05-06
17 7 signup 2023-05-07
18 7 view_product 2023-05-07
19 7 add_to_cart 2023-05-08
20 7 purchase 2023-05-09
21 8 signup 2023-05-08

users — one row per person who has created an account. source records how they arrived: organic means they found Kindled themselves, paid_search means they clicked a bought advert, and referral means an existing customer invited them. signup_date is the day they registered.

id name source signup_date
1 Aiden Cole organic 2023-05-01
2 Bianca Reyes paid_search 2023-05-02
3 Carlos Mora organic 2023-05-03
4 Delia Frank referral 2023-05-04
5 Ewan Blake paid_search 2023-05-05
6 Fiona Grey organic 2023-05-06
7 Gus Herrera referral 2023-05-07
8 Hana Ito paid_search 2023-05-08

Both tables already exist in the database — there is nothing to create or load.

Task: Write a query that returns one row per channel, with columns source and conversion_pct — the share of that channel's people who have at least one purchase, as a percentage rounded to 1 decimal place. Somebody who bought twice still counts once, and a channel whose people bought nothing reports 0 rather than disappearing. Highest rate first; equal rates are listed alphabetically by source.

Example output — shape only, on invented rates. The source labels are the real stored ones, and the bottom row is the case worth noticing: a channel nobody bought through still reports, as 0:

source conversion_pct
organic 62.5
paid_search 20
referral 0

Sign in to solve this problem

Reading problems is free for everyone — solving them (Run, Submit, and tracking what you've solved) needs an account.

Sign in

Discussion

Sign in to join the discussion — reading is open to everyone.

Loading comments…