web-dev-qa-db-fra.com

MySQL et CASE WHEN avec une plage de valeurs

J'ai un tableau des comptes et un tableau des enregistrements où les comptes ont plusieurs enregistrements. Je voudrais ventiler les totaux des comptes par plage de "nombre d'enregistrements". C'est à dire. Afficher la répartition des

Count of Records | Count
=========================
0-25 | 100
25 - 50 | 122
50 - 100 | 300

Etc.

J'utilise la requête suivante, mais je n'arrive pas à la regrouper par "grp", ce que je veux, une aide sur la meilleure façon de modifier la requête?

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
    ORDER BY ct
22
kickdaddy

essaye ça:

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. déterminer dans quel "bucket" ses données seront agrégées ... La ou les expressions définies dans la clause group by sont les "définitions" de ces buckets.

Au fur et à mesure que la requête traite les lignes de données d'origine, toute ligne dont 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 ...

20
Charles Bretana

Vous avez besoin d'une sous-requête. S'il s'agit d'une vue, vous devez alors utiliser deux vues.

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

Group BY s.grp;
7
Sajjad Tariq