Where we are
You can read a query and judge a claim. Now we point that skill at the artifact you see most: the dashboard. Every KPI tile - active subscribers, revenue, churn - is a one-line SQL query someone saved months ago and rarely revisits. Understanding that a tile is a query, not a truth, is what lets you ask why two "subscriber" counts disagree and which one belongs in the decision.
Peel back a tile 6 min live
A KPI tile is the friendly face on a saved SELECT. The big number, the little label, the trend arrow - all of it is the result of a query the BI tool runs on a schedule. Peel it back and the definition choices become visible: which table, which filter, which grain. That is where the real meaning lives.
LiveThe query behind an "active subscribers" tile3 min▶
This is the exact one-liner that a tile like the one above runs. Read it: "count the subscriptions where the cancel date is empty" - because an empty cancel date means the subscription is still live. Run it and you have reproduced the dashboard number yourself.
SELECT COUNT(*) AS active_subs FROM subscriptions WHERE cancel_date IS NULL;
Aggregation traps: cohort vs snapshot 6 min live
The most common dashboard confusion is one word carrying two definitions. "Subscribers" can mean everyone who ever subscribed, or only those active right now - and a dashboard can show both on different tiles, each true. The trap is a denominator game: the word stays the same while the population underneath quietly changes.
Live"Subscribers", version one: active only2 min▶
The active definition again - only live subscriptions count. Run it and hold the number in mind.
SELECT COUNT(*) AS active_subs FROM subscriptions WHERE cancel_date IS NULL;
Live"Subscribers", version two: all-time2 min▶
Same table, drop the filter. Now every subscription ever started counts, including the cancelled ones. Read it: "count all subscriptions." Run it - a larger number, and just as truthful. Same word "subscribers", two numbers, both correct.
SELECT COUNT(*) AS all_subs FROM subscriptions;
The board that saw two "subscriber" numbers. Marketing reported all-time subscribers to show reach; finance reported active subscribers to show recurring revenue. Same word on two slides, two different figures, and twenty minutes lost to "whose number is wrong?" Neither was. The lesson: a count means nothing until the population is named. Ask "active now, or all-time?" before you compare.
Reading a rate: the two halves must match 6 min live
A rate is a fraction, and it is only honest when the top and the bottom describe the same population over the same window. Churn rate is the classic offender: churned customers divided by... which customers? All-time? Active at the start of the month? The denominator you choose can move a churn number by a wide margin without a single customer changing.
LiveA cohort view: new customers per signup month3 min▶
This groups customers into monthly cohorts by their signup month. Read it: "count new customers, per signup month, in date order." substr(signup_date,1,7) just keeps the year and month, like 2026-03. Run it - this is a cohort view, and it tells a different story than a single "total customers" snapshot tile would.
SELECT substr(signup_date, 1, 7) AS cohort,
COUNT(*) AS new_customers
FROM customers
GROUP BY cohort
ORDER BY cohort;
Self-studyThree churn-rate definitions, three numbers2 min read▶
"Churn was 5%" is not a fact until the denominator is named. Here are three common bottoms, each giving a different rate from the same churned customers:
| Denominator | Churn rate means | Watch for |
|---|---|---|
| Active at month start | share of the live base that left | the standard, but the base shifts monthly |
| All-time subscribers | share of everyone who ever joined | flatters the number - big, stable bottom |
| This month's cohort | early drop-off of new joiners | a different question entirely |
None is wrong; they answer different questions. The rule that keeps you safe: the numerator and denominator must be defined over the same population. If the churned customers on top are not drawn from the base on the bottom, the rate is meaningless.
Reverse-engineer one of your own tiles ★ 12 min · discuss together
Take one KPI from a dashboard you actually use. As a group, write its likely one-line query definition, then name the trap to check. You are not writing production SQL - you are stating the definition precisely enough that an analyst could confirm or correct it.
Name the tile and guess the query: which table, which filter, which grain? Write it as one plain sentence.
Name the trap: is it a snapshot pretending to be a trend? A count whose population is ambiguous? A rate with a mismatched denominator?
Write the question for your analyst: one sentence that would confirm the definition. That question is the whole deliverable.
LiveModel it on the active-subscribers tile3 min▶
Use this as your worked example. The tile says "active subscribers"; the one-line definition is "subscriptions where cancel_date is empty"; the trap is "does 'active' mean active now or all-time?" Run it, then repeat the pattern on your own tile.
SELECT COUNT(*) AS active_subs FROM subscriptions WHERE cancel_date IS NULL;
LiveA second tile: completed-order volume3 min▶
Another worked example. Tile: "orders this period"; definition: "count of orders where status is completed"; trap: "are refunds and cancellations included?" Run it and see how the definition choice sets the number.
SELECT COUNT(*) AS completed_orders FROM orders WHERE status = 'completed';
Take this back to your desk ◐ 15 min
- Pick the single most important tile on your main dashboard. Write its likely one-line query definition, then send your analyst the one-sentence question that would confirm it. Compare their answer to your guess.
- Find any two tiles that use the same word - "users", "customers", "revenue". Check whether they share a definition. If they differ, you have found a boardroom argument waiting to happen; get ahead of it.
- For one rate on your dashboard, write down its numerator and denominator explicitly. Confirm they cover the same population and window. If they don't, flag it.
- Optional: preview session a5, where we turn all of this into a precise data request - asking an analyst for exactly the right cut, the first time.
What this maps to
This session connects SQL reading to the BI layer leaders live in every day - dashboards and KPIs - and the definition traps that hide inside them. It covers:
Three questions before you go 🎯 ◐ 90 seconds
1 · A dashboard tile is, underneath...
Every KPI tile is a saved SELECT the BI tool re-runs. The number is real, but so are the definition choices baked into the query - which is what you learn to peel back.
2 · "Active subscribers" can be two different numbers because...
Same word, two populations. "Active now" filters to live subscriptions; "all-time" counts everyone who ever joined. Both are true; ask which definition the tile used.
3 · A rate is trustworthy only when...
A rate is top over bottom. If the churned customers on top are not drawn from the base on the bottom, the rate is meaningless - no matter how precise it looks.