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
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 ...
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;