2012-02-11 67 views
0

我正在運行PostgreSQL。我有一個表稱爲foo。其內容是:自定義組由postgresql

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 

查詢應該怎麼樣?

+0

你是指「考慮所有可能的情況」是什麼意思? 21不是'<'21,這就是爲什麼'pp'不會出現。 – fnl 2012-02-11 18:00:49

+0

是的,但要求是它應該考慮PP。 – goblin2986 2012-02-11 18:01:43

+0

那爲什麼不直接用'HAVING number <= 21'呢? – fnl 2012-02-11 18:02:16

回答

0

這可能與左來解決加盟:

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 

這裏是一個工作example

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 

希望這會有所幫助。

1
SELECT city, count(NULLIF(number < 21, false)) FROM cities GROUP BY city 

應該給你想要的結果。

0

想我誤解了問題的第一時間,但試試這個:

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,再算上出現的次數的那些城市。

下半年發現的城市沒有條目< 21,然後對它們進行計數。