2008-10-13 7 views
9

Étant donné une table (mytable) contenant un champ numérique (mynum), comment procéder pour écrire une requête SQL qui résume les données de la table en fonction des plages de valeurs de ce champ plutôt que de chaque valeur distincte? Pour un exemple plus concret, faisons des intervalles de 3 et juste "summary" avec un nombre (*), de telle sorte que les résultats indiquent le nombre de lignes où mynum est 0-2.99, le nombre de les lignes où il est, 3 à 5,99 où il est, etc. 6 à 8,99Regroupement par intervalles

Répondre

14

l'idée est de calculer une fonction du champ qui a une valeur constante au sein de chaque groupe que vous voulez:

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

Si vous avez modifié légèrement cette 3 * ronde (mynum/3.0) vous auriez la limite inférieure de chaque groupe affiché pour vous . – DBMarcos99

2

Je ne sais pas si cela est applicable à mySql, de toute façon dans SQL Server, je pense que vous pouvez "simplement" utiliser group by dans la liste de sélection et la liste group by.

Quelque chose comme:

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 

retours quelque chose comme

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

Je ne sais pas si cela fonctionnerait dans MySQL non plus, mais il a le problème de se limiter aux groupes que vous définissez plutôt que de couvrir toutes les plages de trois (sans, par exemple, définir 334 cas si vos valeurs augmentent à 1000, alors en espérant qu'un 1002 ne se montre jamais). –