2017-09-27 13 views
0

Je cherche un moyen de regrouper les données MYSql dans des compartiments (plages de valeurs) puis de compter le nombre de valeurs dans chaque groupe, puis de les tracer sur un graphique.MYSQL - Comment regrouper les données en fonction des plages et en compter

J'ai beaucoup de gammes, pas peu comme ici que je ferais manuellement.

Par exemple, si mes données ressemble à:

+--------+ 
| column | 
+--------+ 
|  1 | 
|  2 | 
|  10 | 
|  15 | 
|  20 | 
| 100 | 
| 150 | 
| 1000 | 
| 10000 | 
+--------+ 

je pouvais créer des seaux et compter le nombre de valeurs dans chaque seau:

+-------------+---------------+-----------------+-----------------+ 
| bucket(0-9) | bucket(10-99) | bucket(100-999) | bucket(1000-1M) | 
+-------------+---------------+-----------------+-----------------+ 
|   2 |    3 |    2 |    2 | 
+-------------+---------------+-----------------+-----------------+ 
  • Count (0-9) => 2 valeurs
  • Nombre (10-99) => 3 valeurs
  • Nombre (100-999) => 2 Valeurs
  • Count (1000-1M) => 2 Valeurs
+0

Pour un certain nombre dynamique de godets, vous devez utiliser les instructions préparées. –

+0

Pouvez-vous me montrer un exemple? –

+0

@GiorgosBetsos Je ne vois pas dans quel sens cela est 'dynamique'. La plage semble être construite manuellement. Inversement, il était * dynamique *, je ne vois pas pourquoi cela nécessiterait l'utilisation de déclarations préparées - bien que j'accepte que ce serait une solution. – Strawberry

Répondre

2

Si la limite supérieure est inférieure à 1 M, vous pouvez peut-être essayer count(case when ... then .. end) en fonction de vos données d'échantillon et résultat souhaité:

select 
    count(case when col between 0 and 9 then 1 end) `bucket(0-9)`, 
    count(case when col between 10 and 99 then 1 end) `bucket(10-99)`, 
    count(case when col between 100 and 999 then 1 end) `bucket(100-999)`, 
    count(case when col between 1000 and 1000000 then 1 end) `bucket(1000-1M)` 
from test 

Vérifier demo dans SQLFiddle.

+0

génial. Je vais l'essayer! –

+0

est la limite supérieure 1M importante –

+0

Si vous avez un autre intervalle comme plus de 1M, alors ajouter un autre «compte» devrait être nécessaire. – Blank

0

Voici une autre idée de jouer avec ...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table (i INT NOT NULL PRIMARY KEY); 

INSERT INTO my_table VALUES 
(1), 
(2), 
(10), 
(15), 
(20), 
(100), 
(150), 
(1000), 
(10000); 

SELECT LENGTH(i) bucket 
    , CONCAT(RPAD(1,LENGTH(i),0),'-',RPAD(9,LENGTH(i),9)) range 
    , COUNT(*) total 
    FROM my_table 
GROUP 
    BY bucket; 
+--------+-------------+-------+ 
| bucket | range  | total | 
+--------+-------------+-------+ 
|  1 | 1-9   |  2 | 
|  2 | 10-99  |  3 | 
|  3 | 100-999  |  2 | 
|  4 | 1000-9999 |  1 | 
|  5 | 10000-99999 |  1 | 
+--------+-------------+-------+