Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL e CASE WHEN com um intervalo de valores


tente isso:
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(*)

Você tem que "definir" os "buckets" nos quais deseja agregar as linhas de dados originais... É para isso que serve a cláusula Group By... Ela define os critérios pelos quais cada linha nas tabelas base será analisada para determinar em qual "bucket" seus dados serão agregados... A expressão ou expressões definidas na cláusula group by são as "definições" para esses buckets.

À medida que a consulta processa as linhas de dados originais, qualquer linha para a qual o(s) valor(es) dessa(s) expressão(ões) seja(m) igual(es) a um bucket existente é agregada a esse bucket... Qualquer nova linha com um valor não representado por um bucket faz com que um novo bucket seja criado...