How to group results

Form groups

GROUP BY gathers rows with equal values, then aggregates each group.

SELECT level, COUNT(*) AS course_count
FROM courses
GROUP BY level;

Select grouped values

A grouped query should select only grouped expressions or aggregate results. SQLite may allow other columns, but their values can be arbitrary; PostgreSQL correctly rejects most such queries.

Filter groups with HAVING

WHERE filters rows before grouping; HAVING filters completed groups.

SELECT level, COUNT(*) AS course_count
FROM courses
GROUP BY level
HAVING COUNT(*) >= 3;

Sort the summary

Use ORDER BY after grouping to present the result predictably.

SELECT level, AVG(duration_minutes) AS average_minutes
FROM courses
GROUP BY level
ORDER BY average_minutes DESC;