Создайте таблицу, содержащую ваши группы:
CREATE TABLE agebands
(
id INT NOT NULL PRIMARY KEY,
lower_bound INT NOT NULL,
upper_bound INT NOT NULL
)
CREATE INDEX IDX_agebands_bounds ON (lower_bound, upper_bound)
Затем заполните его своими данными:
INSERT INTO agebands VALUES (1, 0, 12)
INSERT INTO agebands VALUES (2, 13, 17)
INSERT INTO agebands VALUES (3, 18, 24)
INSERT INTO agebands VALUES (4, 25, 199)
Тогда присоединяйтесь к нему:
SELECT
lower_bound, upper_bound,
COUNT(*) AS number_of_people
FROM
persons
INNER JOIN agebands
ON person_age BETWEEN lower_bound AND upper_bound
GROUP BY
lower_bound, upper_bound
ORDER BY
lower_bound
Это позволяет гибко настраивать полосы. Конечно, другой ответ, использующий UNION, также пригоден для использования, что более уместно, если вы можете / не будете добавлять другую таблицу в свою базу данных.