У вас есть нулевые значения, так вам нужен left join
:
select agegrp, count(t.agegrp)
from (select '1-10' as agegrp, 1 as lowb, 10 as hib union all
select '11-20' as agegrp, 11, 20 union all
select '21-30' as agegrp, 21, 30 upperbound union all
select '31-40' as agegrp, 31, 40 as upperbound union all
select '40+' as agegrp, 41, NULL as upperbound
) ag left join
t
on t.age >= ag.lowb and t.age <= ag.hib
group by ag.agegrp
order by ag.lowb;
Примечание: предполагается, что столбец является целым числом, поэтому недопустимое значение 30.5. Легко настроить запрос для обработки нецелого возраста, если это необходимо.
Почему редактирование? Ваш исходный вопрос касался SQL, и вы приняли ответ в SQL. Если вы также хотите знать, как вы это делаете в R, задайте отдельный вопрос. –