159 hands-on challenges counted from the live bank — 31 Easy, 81 Medium, 47 Hard — every one on the Skillmap's Aggregation & Grouping axis: COUNT and SUM over a whole table, GROUP BY on one key or on several, HAVING to filter the groups you just made, and the COUNT(DISTINCT …) trap. Cards marked Free (including the 5 Hard previews) are open to free accounts — your first 10 challenge solves are free — and Pro opens every card. Real datasets, AI tutoring.
More than half the bank touches aggregation, so this page does not put every one of them on a card. The five sections below are the five shapes the work takes, each a predicate over the reference solution — an aggregate with no GROUP BY, one grouping key on one table, two or more keys, a HAVING clause, a COUNT(DISTINCT …) — and each lists every challenge in the bank that matches it, so a section is complete even though the page is a selection. What is left out aggregates inside a join, a window function, a CTE, a subquery or a CASE: that is what the joins, window functions, CTE, subquery and CASE WHEN pages are organised around.
No GROUP BY at all — COUNT(*), SUM(amount), AVG(price), MIN and MAX collapse every row that survived the WHERE into a single answer. Start with Counting Rows, then SUM, AVG, MIN, MAX: the two written for the syntax. Every one here is Easy and marked Free, and three of them run on real public data — FDIC deposits, NYC assessed values, factory sensor readings. The cheat sheet has the whole list on one screen.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
One grouping key, one table, no HAVING: SELECT department, COUNT(*) FROM employees GROUP BY department. The rule that catches everyone is that every column in the SELECT list is either aggregated or named in the GROUP BY — SQLite will happily return a value from an arbitrary row instead of erroring. Start with GROUP BY Basics; Monthly Order Count and Day-of-Week Order Pattern (strftime) group by an expression rather than a column, which is the next step. The GROUP BY tutorial walks the mental model.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
Uses: GROUP BY SUBSTR String Functions
Finance & Banking track · Uses: GROUP BY Aggregation ORDER BY
Manufacturing & Industry track · Uses: GROUP BY Aggregation
Finance & Banking track · Uses: GROUP BY Aggregation IS NULL ORDER BY
Finance & Banking track · Uses: WHERE GROUP BY Date Functions AVG
Uses: Date Functions strftime GROUP BY Aggregation
Finance & Banking track · Uses: WHERE Date Functions Aggregation GROUP BY
Finance & Banking track · Uses: GROUP BY Aggregation Date Functions JULIANDAY
Add a key and the grain of the answer changes: GROUP BY country, category gives one row per pair, not one per country. This is where cross-tabs, cohort tables and per-group top-N live, and where a fanned-out join quietly doubles your SUM. Start with Counting Across a JOIN, then Survival Cross-Tab: Class × Sex; the Hard ones carry the pairs through CTEs and window functions.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
Finance & Banking track · Uses: GROUP BY SUM strftime GROUP BY + Date Functions
Uses: LEFT JOIN COALESCE Aggregation GROUP BY
Uses: GROUP BY Aggregation Window Functions LAG
Uses: CROSS JOIN LEFT JOIN COUNT Cross Join
Uses: CROSS JOIN LEFT JOIN GROUP BY Cross Join
Finance & Banking track · Uses: JOIN GROUP BY Aggregation Multi-JOIN
Finance & Banking track · Uses: GROUP BY HAVING Date Functions
Finance & Banking track · Uses: JOIN GROUP BY Aggregation CASE
Finance & Banking track · Uses: Window Functions ROW_NUMBER PARTITION BY JOIN
Finance & Banking track · Uses: JOIN LEFT JOIN GROUP BY HAVING
Finance & Banking track · Uses: Subquery JOIN GROUP BY SUM
Finance & Banking track · Uses: Window Functions RANK ROW_NUMBER JOIN
Uses: CTE Window Functions LAG Running Total
Manufacturing & Industry track · Uses: CTE JOIN CASE GROUP BY
Finance & Banking track · Uses: JOIN GROUP BY Date Functions Self-Join
Finance & Banking track · Uses: JOIN GROUP BY HAVING CASE
Uses: SELECT CTE Window Functions ROW_NUMBER JOIN GROUP BY
WHERE runs before the grouping and HAVING after it, so a condition on COUNT(*) or SUM(total) can only ever be a HAVING — and a condition on a plain column belongs in WHERE, where it throws rows away before they cost anything. Start with High-Volume Categories (HAVING), then GROUP BY + HAVING, both written for the clause. WHERE vs HAVING has the execution order in one diagram.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
Finance & Banking track · Uses: GROUP BY HAVING Aggregation
Manufacturing & Industry track · Uses: GROUP BY HAVING Aggregation
Uses: GROUP BY Aggregation Subquery HAVING
Finance & Banking track · Uses: JOIN GROUP BY Aggregation HAVING
Finance & Banking track · Uses: GROUP BY HAVING Date Functions
Finance & Banking track · Uses: JOIN LEFT JOIN GROUP BY HAVING
Uses: Window Functions Frame Clause CTE GROUP BY
Uses: String Functions GROUP BY HAVING Aggregation
Uses: CTE Window Functions LAG Running Total
Finance & Banking track · Uses: JOIN GROUP BY Date Functions Self-Join
Finance & Banking track · Uses: JOIN GROUP BY HAVING CASE
COUNT(*) counts rows, COUNT(x) counts the rows where x is not NULL, and COUNT(DISTINCT x) counts different values — after a join those are three different answers, and picking the wrong one is the most common wrong number in an analytics dashboard. Start with How Many Genres Do We Cover? (DISTINCT); Daily Active Customers and Customer Retention Cohort are the shape an interview asks for.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
Finance & Banking track · Uses: JOIN GROUP BY COUNT DISTINCT strftime
Finance & Banking track · Uses: JOIN GROUP BY COUNT DISTINCT Aggregation
Uses: GROUP BY Aggregation COUNT DISTINCT GROUP BY + Date Functions
Finance & Banking track · Uses: JOIN GROUP BY HAVING CASE
Aggregation is the skill the rest of the bank is built on, so it also turns up wherever the other topics do. If you want it with a join, a window frame or a CTE around it, the sibling pages list those: joins, window functions, CTEs, subqueries and CASE WHEN.