Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL et CASE WHEN avec une plage de valeurs

essayez ceci :

SELECT count(*) as ct, 
CASE  
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' 
END AS grp 
FROM records r, accounts a 
WHERE r.account_id=a.id 
GROUP BY r.account_id, a.id, 
    CASE  
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' END
ORDER BY count(*)

Vous devez "définir" les "compartiments" dans lesquels vous souhaitez agréger les lignes de données d'origine... C'est à cela que sert la clause Group By... Elle définit les critères selon lesquels chaque ligne des tables de base sera analysée pour déterminez dans quel "compartiment" ses données seront agrégées... L'expression ou les expressions définies dans la clause group by sont les "définitions" de ces compartiments.

Lorsque la requête traite les lignes de données d'origine, toute ligne pour laquelle la ou les valeurs de cette ou ces expressions sont identiques à celles d'un compartiment existant est agrégée dans ce compartiment... Toute nouvelle ligne avec une valeur non représentée par un existant bucket provoque la création d'un nouveau bucket...