Думаю, я неправильно понял вопрос в первый раз, но попробуйте это:
select f1.city,count(*) from foo f1
where f1.city in (select f2.city from foo f2 where f2.number < 21)
group by f1.city
union
select f3.city,0 from foo f3
where not exists (select * from foo f4 where f3.city=f4.city and f4.number < 21)
group by f3.city
Объединение разбивает запрос так, чтобы первая половина идентифицировала, в каких городах есть запись <21, а затем подсчитала количество вхождений этих городов. </p>
Вторая половина идентифицирует города, в которых нет записи <21, а затем считает их. </p>