Aggregates
Having
Filtering Groups
HAVING filters after grouping. It can use aggregate values that WHERE cannot.
Program
Play the query to keep only items with at least five sold.
having.sql
Replay: real traced execution (multi-file project)
CREATE TABLE sales (item TEXT, qty INTEGER);
INSERT INTO sales VALUES ('book', 2), ('pen', 5), ('book', 3), ('pencil', 1);
SELECT item, SUM(qty) AS sold FROM sales GROUP BY item HAVING SUM(qty) >= 5 ORDER BY item;
tables ← 1 row
1CREATE TABLE sales (item TEXT, qty INTEGER);2INSERT INTO sales VALUES ('book', 2), ('pen', 5), ('book', 3), ('pencil', 1);values this step1 rowtablessales ← 4 rows
1CREATE TABLE sales (item TEXT, qty INTEGER);2INSERT INTO sales VALUES ('book', 2), ('pen', 5), ('book', 3), ('pencil', 1);3SELECT item, SUM(qty) AS sold FROM sales GROUP BY item HAVING SUM(qty) >= 5 ORDER BY item;values this step4 rowssalesresult ← 2 rows
2INSERT INTO sales VALUES ('book', 2), ('pen', 5), ('book', 3), ('pencil', 1);3SELECT item, SUM(qty) AS sold FROM sales GROUP BY item HAVING SUM(qty) >= 5 ORDER BY item;values this step2 rowsresult
Filter After Totals
- Group rows by
item. - Sum each group's
qty. HAVING SUM(qty) >= 5keeps only groups with totals at least5.pencilis removed because its group total is1. | Item group | Sold | Kept? | | --- | --- | --- | |book|5| yes | |pen|5| yes | |pencil|1| no |
HAVING
`HAVING SUM(qty) >= 5` keeps groups after aggregation.
WHERE vs HAVING
`WHERE` filters rows before grouping; `HAVING` filters groups after grouping.
threshold
Aggregate filters are useful for leaderboards and reports.
Exercise: having.sql
Group sales by item, keep only groups with at least five sold, and sort the kept rows