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

MySQL og CASE WHEN med en række værdier

prøv dette:

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

Du skal "definere" de "buckets", du ønsker at aggregere de originale datarækker til... Dette er, hvad Group By-sætningen er til for... Den definerer de kriterier, som hver række i basistabellerne vil blive analyseret efter. bestemme, hvilken "bucket" dets data vil blive aggregeret i... Udtrykket eller udtrykkene defineret i group by-sætningen er "definitionerne" for disse buckets.

Efterhånden som forespørgslen behandler de originale datarækker, aggregeres enhver række, for hvilke værdien/værdierne af dette udtryk er de samme som en eksisterende bucket, i den bucket... Enhver ny række med en værdi, der ikke er repræsenteret af en eksisterende bucket bucket får en ny bucket til at blive oprettet...



  1. Parse SELECT-sætning af SQL-forespørgsler i et PHP-array

  2. Guide til designdatabase til quiz i MySQL

  3. ÆNDRE TABEL uden at låse bordet?

  4. PostgreSQL Upsert differentiere indsatte og opdaterede rækker ved hjælp af systemkolonner XMIN, XMAX og andre