Skip to content
RED SAGSkills

Subscription Churn by Plan

In subscriptions, an active subscription has a NULL ended_at; a churned one has an end date.

For each plan, report:

- total_subs: number of subscriptions - churned_subs: number with a non-NULL ended_at - churn_rate_pct: 100.0 * churned_subs / total_subs, ROUND(x, 2)

Return columns plan, total_subs, churned_subs, churn_rate_pct. Order by churn_rate_pct descending, then plan ascending.

Schema

CREATE TABLE subscriptions (
  sub_id INTEGER PRIMARY KEY,
  user_id INTEGER NOT NULL,
  plan TEXT NOT NULL,
  started_at TEXT NOT NULL,
  ended_at TEXT
);

Sample data

subscriptions

sub_iduser_idplanstarted_atended_at
11basic2025-09-012025-12-01
22basic2025-09-10NULL
33pro2025-10-01NULL
44pro2025-10-05NULL
55basic2025-11-012026-01-15
66team2025-11-202026-02-01
77pro2025-12-012026-03-01
88team2026-01-01NULL
Hint 1

SUM(CASE WHEN ... THEN 1 ELSE 0 END) counts the rows that meet a condition.

Hint 2

COUNT(ended_at) also works, because COUNT(column) skips NULLs.

Good practice for: Data Analyst, Product Manager, Business Analyst, Data Scientist

SQL (SQLite)

Run checks your query on the sample data (Ctrl + '). Submit also checks hidden databases.