2011-02-27 17 views
6

¡Salve, pila!Cómo seleccionar el recuento de valores agrupados por rangos

Necesito seleccionar el recuento de valores agrupados por rangos.

Para ejemplificar, supongamos que tengo los siguientes valores en una columm tabla: 1,2,4,5,6,8,9,11,13,16

Entonces, quiero retreave el recuento de ellos en rangos de 5, así:

From 0 to 4 there is 3 values (1,2,4) 
From 5 to 9 there is 4 values (5,6,8,9) 
From 10 to 14 there is 2 values (11,13) 
From 15 to 19 there is 1 values (16) 

Y etc ...

¿Cómo puedo hacer esto en una consulta?

Respuesta

13

Tal vez esto es lo que quiere:

SELECT 
    5 * (n div 5) as 'from', 
    5 * (n div 5) + 4 as 'to', 
    COUNT(*) 
FROM yourtable 
GROUP BY n div 5; 

Para su muestra de esta consulta le da

+------+------+----------+ 
| from | to | count(*) | 
+------+------+----------+ 
| 0 | 4 |  3 | 
| 5 | 9 |  4 | 
| 10 | 14 |  2 | 
| 15 | 19 |  1 | 
+------+------+----------+ 
4 rows in set (0.00 sec) 
+0

Esto es básicamente la idea de Guffa publicada 8 minutos después. – Andomar

+2

@Andomar no, no lo es. MySQL (n/5) devuelve un decimal, incluso si n no es un decimal. 'div' required – RichardTheKiwi

+0

¡El trabajo es como se supone que debe hacerlo! – NemoStein

3

Una forma es la suma + caso de enfoque:

select sum(case when col1 between 0 and 4 then 1 end) 
,  sum(case when col1 between 5 and 9 then 1 end) 
,  sum(case when col1 between 10 and 14 then 1 end) 
... 
from YourTable 

Otro enfoque es tener una tabla de gama, lleno como:

start end 
0  4 
5  9 
10  14 

A continuación, se puede:

select r.start 
,  r.end 
,  count(case when yt.col1 between r.start and r.end then 1 end) 
from YourTable yt 
cross join 
     RangeTable r 
group by 
     r.start 
,  r.end 
2

Calcule un valor en el que pueda agrupar. En este caso sólo hay que dividir el valor en un 5 para conseguir ese resultado:

select value/5 as Group, count(*) as Cnt 
from TheTable 
group by value/5 

Esto le dará a usted es resultado como este:

Group Cnt 
0  3 
1  4 
2  2 
3  1 
0
select 
val/5 as grp, 
case val/5 
when 0 then ' 0 to 5' 
when 1 then ' 5 to 10' 
when 2 then '10 to 15' 
when 3 then '15 to 20' 
end 
as grpname, 
count(distinct val) as cnt 
from 
(
select 1 as val 
union select 2 
union select 4 
union select 5 
union select 6 
union select 8 
union select 9 
union select 11 
union select 13 
union select 16 
) a 
group by 
val/5 
0

¿Qué tal

for(i=MIN_OF_TABLE-1;i<=MAX_OF_TABLE;$i+=RANGE){ 
    SELECT COUNT(`VALUE`),GROUP_CONCAT(`VALUE`) FROM `TABLE` WHERE `VALUE`>i AND `VALUE`<=i+RANGE; 
} 

Esto obtendrá filas que contienen la información que se muestra en las filas =)

+0

Soy nuevo en datos SQL. ¿Hay alguna razón por la cual esta no sea la mejor solución? – nyxee

Cuestiones relacionadas