Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL und CASE WHEN mit einem Wertebereich

versuchen Sie Folgendes:

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

Sie müssen die "Buckets" "definieren", in denen Sie die ursprünglichen Datenzeilen aggregieren möchten ... Dafür ist die Group By-Klausel gedacht ... Sie definiert die Kriterien, nach denen jede Zeile in den Basistabellen analysiert wird Bestimmen Sie, in welchen "Bucket" die Daten aggregiert werden ... Der Ausdruck oder die Ausdrücke, die in der group by-Klausel definiert sind, sind die "Definitionen" für diese Buckets.

Während die Abfrage die ursprünglichen Datenzeilen verarbeitet, wird jede Zeile, für die der/die Wert(e) dieses Ausdrucks/dieser Ausdrücke mit einem vorhandenen Bucket identisch sind, in diesen Bucket aggregiert... Jede neue Zeile mit einem Wert, der nicht durch einen vorhandenen repräsentiert wird Bucket bewirkt, dass ein neuer Bucket erstellt wird...