2010-01-04 5 views
6

dire che ho un tavolo di proprietà immobiliari:gruppo per fascia di prezzo

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

mi piacerebbe loro gruppo da 0 - 49.999, 50.000 - 99.999 e 100.000 - 200.000

Così il risultato dovrebbe essere:

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

C'è un modo per farlo in una dichiarazione SQL? A proposito, sto usando Postgres.

+2

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

+3

Siate onesti e accettare le risposte per le vostre domande recenti. – hsz

risposta

10

È possibile GROUP BY un experession, qualcosa di simile:

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

Suppongo che potresti anche usare CASE che tvanfosson menzionato nell'espressione GROUP BY evita le subquery allo stesso tempo. Anche se dovresti misurare in che modo si comporta meglio. –

4

Dipende se si desidera accettare una subselect nella dichiarazione e ancora chiamarla una dichiarazione. Supponendo che vuoi estendere i tuoi intervalli, una sottoselezione con un'istruzione case per impostare l'intervallo, allora funzionerà un raggruppamento esterno per intervallo. Se tutti i tuoi intervalli fossero della stessa dimensione, sarebbe più facile, in quanto potresti semplicemente dividere per la dimensione dell'intervallo e raggruppare per quello.

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