2008-10-13 12 views
9

Dada una tabla (mitabla) que contiene un campo numérico (mynum), ¿cómo se podría escribir una consulta SQL que resuma los datos de la tabla en función de los rangos de valores en ese campo en lugar de cada valor distinto?Agrupación por intervalos

En aras de un ejemplo más concreto, hagamos intervalos de 3 y simplemente "resumamos" con un conteo (*), de manera que los resultados indiquen el número de filas donde mynum es 0-2.99, el número de filas filas en las que es 3-5,99, donde es 6-8,99, etc.

Respuesta

14

la idea es calcular alguna función del campo que tiene un valor constante dentro de cada grupo que desea:

select count(*), round(mynum/3.0) foo from mytable group by foo; 
+3

Si ha cambiado ligeramente para esta ronda 3 * (myNum/3.0) que tendría el límite inferior de cada agrupación se muestra para usted . – DBMarcos99

2

no sé si esto es aplicable a mySql, de todos modos en SQL Server creo que puede "simplemente" usar group by en la lista de selección Y en la lista de group by.

Algo así como:

select 
    CASE 
     WHEN id <= 20 THEN 'lessthan20' 
     WHEN id > 20 and id <= 30 THEN '20and30' ELSE 'morethan30' END, 
    count(*) 
from Profiles 
where 1=1 
group by 
    CASE 
     WHEN id <= 20 THEN 'lessthan20' 
     WHEN id > 20 and id <= 30 THEN '20and30' ELSE 'morethan30' END 

vuelve algo así como

column1  column2  
---------- ---------- 
20and30  3   
lessthan20 3   
morethan30 13   
+0

No estoy seguro de si esto funcionaría en MySQL tampoco, pero tiene el problema de estar limitado solo a los grupos que define en lugar de cubrir cada rango de tres que ocurre (sin, por ejemplo, definir 334 casos si sus valores aumentan a 1000, luego esperando que 1002 nunca aparezca). –

Cuestiones relacionadas