2012-02-11 4 views
0

私はPostgreSQLを実行しています。私はselect count(city) from foo group by city having number<21ようなクエリを実行する場合、私はカスタムグループBy postgresql

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

を取得します

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

が、私は結果がこのようなcityのすべての可能な例を検討したい:私はあるfoo .Itsコンテンツと呼ばれるテーブルを持っています:

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

どのようにクエリを表示する必要がありますか?

+0

「すべての可能なケースを検討する」とはどういう意味ですか? 21は '<' 21ではないため、 'pp'が表示されません。 – fnl

+0

ええ、しかし、要件はppも考慮する必要があります。 – goblin2986

+0

次に、「HAVING number <= 21」を使用しないのはなぜですか? – fnl

答えて

0

これは左で解決することができている参加:あなたの例が間違っているssは1の値を持つ必要がありますので、ない2:

ここ

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です

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のエントリがない都市が示されています。