Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL e CASE WHEN con un intervallo di valori

prova questo:

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(*)

Devi "definire" i "bucket" in cui desideri aggregare le righe di dati originali... Ecco a cosa serve la clausola Group By... Definisce i criteri in base ai quali verrà analizzata ogni riga nelle tabelle di base determinare in quale "bucket" verranno aggregati i dati... L'espressione o le espressioni definite nella clausola group by sono le "definizioni" per quei bucket.

Poiché la query elabora le righe di dati originali, qualsiasi riga per cui i valori di queste espressioni sono gli stessi di un bucket esistente viene aggregata in quel bucket... Qualsiasi nuova riga con un valore non rappresentato da un bucket esistente bucket determina la creazione di un nuovo bucket...