How to Group Rows Into Buckets with Count in a SQL Query

How can we group rows returned from a SQL query into buckets with the count in each bucket?

Example grouping with bucket counts

Suppose we have a table of people with name and age columns.

name age
John 4
Jane 19
Bob 21
George 29
Jack 31

We want to group people into categories and get the number of people in each category.

category count
Below 20 2
Between 20 and 30 2
Above 30 1

SQL query to group rows into buckets with counts

We can use a simple CASE expression to bucket rows based on certain column values.

    WHEN age >= 0 AND age <= 20 THEN 'Below 20'
    WHEN age > 20 AND age <= 30 THEN 'Between 20 and 30'
    WHEN age > 30 THEN 'Above 30'
  END category,
  count(*) AS count
FROM tableName