Je suis en train de compter le nombre de personnes par tranche d'âge, et je peux presque le faire avec 2 problèmes:MySQL GROUP BY tranche d'âge, y compris gammes null
S'il n'y a personne dans une donnée âge (NULL), cette plage d'âge n'apparaît pas dans les résultats. Par exemple, dans mes données, il n'y a pas d'entrées pour "Plus de 80", de sorte que la plage de dates n'apparaît pas. Fondamentalement, cela ressemble à une erreur dans la programmation quand il y a des plages de dates manquantes.
J'aimerais commander les résultats d'une manière spécifique. Dans la requête ci-dessous, étant donné que ORDER BY est défini par age_range, les résultats pour '20 - 29 'viennent avant les résultats pour' Under 20 '.
Voici un échantillon de la table db "demandes":
inquiry_id birth_date
1 1960-02-01
2 1962-03-04
3 1970-03-08
4 1980-03-02
5 1990-02-08
Voici la requête:
SELECT
CASE
WHEN age < 20 THEN 'Under 20'
WHEN age BETWEEN 20 and 29 THEN '20 - 29'
WHEN age BETWEEN 30 and 39 THEN '30 - 39'
WHEN age BETWEEN 40 and 49 THEN '40 - 49'
WHEN age BETWEEN 50 and 59 THEN '50 - 59'
WHEN age BETWEEN 60 and 69 THEN '60 - 69'
WHEN age BETWEEN 70 and 79 THEN '70 - 79'
WHEN age >= 80 THEN 'Over 80'
WHEN age IS NULL THEN 'Not Filled In (NULL)'
END as age_range,
COUNT(*) AS count
FROM (SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM inquiries) as derived
GROUP BY age_range
ORDER BY age_range
est ici une solution simple basée sur la suggestion faite par Wrikken:
SELECT
SUM(IF(age < 20,1,0)) as 'Under 20',
SUM(IF(age BETWEEN 20 and 29,1,0)) as '20 - 29',
SUM(IF(age BETWEEN 30 and 39,1,0)) as '30 - 39',
SUM(IF(age BETWEEN 40 and 49,1,0)) as '40 - 49',
SUM(IF(age BETWEEN 50 and 59,1,0)) as '50 - 59',
SUM(IF(age BETWEEN 60 and 69,1,0)) as '60 - 69',
SUM(IF(age BETWEEN 70 and 79,1,0)) as '70 - 79',
SUM(IF(age >=80, 1, 0)) as 'Over 80',
SUM(IF(age IS NULL, 1, 0)) as 'Not Filled In (NULL)'
FROM (SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM inquiries) as derived
Votre question a déjà répondu à ma propre question. Merci pour cela :) –