2010-01-04 7 views
6

Dire que j'ai une table de biens immobiliers:groupe par gamme de prix

A 15,000 
B 50,000 
C 100,000 
D 25,000 

Je voudrais regrouper par 0 - 49999, 50 000 - 99999 et 100 000 - 200 000

Ainsi, le résultat devrait être:

0 - 49k (2) 
50k - 99k (1) 
100k - 200k (1) 

Existe-t-il un moyen de le faire dans une instruction SQL? J'utilise Postgres en passant.

+2

http://stackoverflow.com/questions/232387/in-sql-how-can-you-group-by-in-ranges –

+3

Soyez honnête et accepter des réponses à vos questions récentes. – hsz

Répondre

10

Vous pouvez GROUP BY un experession, quelque chose comme ça:

SELECT price/50000*50000 AS minPrice, 
    (price/50000+1)*50000-1 AS maxPrice, 
    COUNT(*) 
FROM table 
GROUP BY price/50000; 
+0

Je suppose que vous pourriez même utiliser CASE que tvanfosson mentionné dans l'expression GROUP BY en évitant les sous-requêtes en même temps. Bien que vous devriez mesurer de quelle manière fonctionne mieux. –

4

diffère selon que vous accepteriez une sous-sélection dans la déclaration et encore appeler une déclaration. En supposant que vous souhaitez étendre vos plages, une sous-sélection avec une instruction de cas pour définir la plage, un regroupement de sélection externe par plage fonctionnerait. Si toutes vos plages étaient de la même taille, ce serait plus facile car vous pourriez simplement diviser par la taille de la plage et le groupe par cela.

select t.range, count(*) as num 
from 
    (select case 
     when price < 50000 then '0 - 49K' 
     when price >= 50000 and price < 100000 then '50 - 99K' 
     when price >= 100000 and price < 200000 then '100 - 199K' 
     ... 
     end 
     as range, 
     price 
     from table) as t 
group by range