Пользовательская группа По postgresql - PullRequest
0 голосов
/ 11 февраля 2012

Я использую PostgreSQL.У меня есть таблица с именем foo. Ее содержимое:

city|number
'oo'|12
'ss'|11
'ss'|23
'oo'|11
'pp'|21

Если я выполню запрос типа select count(city) from foo group by city having number<21, я получу

city|number
'oo'|2
'ss'|2

, но я хочу, чтобы результат был рассмотренвсе возможные случаи city примерно так:

city|number
'oo'|2
'ss'|2
'pp'|0

Как должен выглядеть запрос?

Ответы [ 3 ]

1 голос
/ 11 февраля 2012
SELECT city, count(NULLIF(number < 21, false)) FROM cities GROUP BY city

должен дать желаемый результат.

0 голосов
/ 11 февраля 2012

Это можно решить с помощью левого соединения:

select f1.city, count(f2.number) as total from foo as f1
left join foo as f2
on f1.cityId = f2.cityId and f1.number < 21
group by f1.city

Вот рабочий пример

PS: Ваш пример неверен, потому что ss должен иметьзначение 1, а не 2:

YOUR EXAMPLE         WHAT I THINK YOU REALLY WANT
city|number                   city|number
'oo'|2                        'oo'|2
'ss'|2                        'ss'|1
'pp'|0                        'pp'|0 

Надеюсь, это поможет.

0 голосов
/ 11 февраля 2012

Думаю, я неправильно понял вопрос в первый раз, но попробуйте это:

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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...