web-dev-qa-db-fra.com

Créer des bacs de plage à partir d'une table SQL Server pour les histogrammes

J'ai le tableau suivant dans SQL Server:

-----------------------------
ID       Age          Gender
1          30           F
2          35           M
3          32           M
4          18           F
5          21           F

Ce que je dois faire est d'exécuter une requête qui regroupera les enregistrements dans des plages données et comptera les occurrences. Les résultats doivent être affichés ultérieurement dans un histogramme (graphique à barres). J'ai essayé une requête similaire à la suivante:

SELECT 
count(CASE WHEN Age>= 10 AND Age < 20 THEN 1 END) AS '10 - 20',
count(CASE WHEN Age>= 21 AND Age < 30 THEN 1 END) AS '21 - 30',
count(CASE WHEN Age>= 31 AND Age < 35 THEN 1 END) AS '31 - 35',
count(CASE WHEN Age>= 36 AND Age < 40 THEN 1 END) AS '36 - 40',
FROM (SELECT Age FROM Attendees) AS AgeGroups

Pour le moment, cela fait l'affaire, mais ne tient pas compte de la colonne genre. Il en résultera une seule ligne qui compte la fréquence de chaque groupe d'âge:

10-20     21-30     31-35     36-40
  0         22        21        13

Si le sexe est pris en compte, il devrait y avoir deux enregistrements pour chaque sexe. J'ai besoin de voir quelque chose comme:

Gender    10-20     21-30     31-35     36-40
  M         0         12        9         6
  F         0         10        12        7

Comment dois-je aborder ce problème?

19
user10901

Ajoutez simplement la colonne Gender à votre SELECT puis effectuez une GROUP BY.

SELECT 
Gender,
count(CASE WHEN Age>= 10 AND Age < 20 THEN 1 END) AS [10 - 20],
count(CASE WHEN Age>= 21 AND Age < 30 THEN 1 END) AS [21 - 30],
count(CASE WHEN Age>= 31 AND Age < 35 THEN 1 END) AS [31 - 35],
count(CASE WHEN Age>= 36 AND Age < 40 THEN 1 END) AS [36 - 40]
FROM Attendees AS AgeGroups
GROUP BY Gender
32
Lamak

L'exemple ci-dessus exclut les valeurs 20, 30, 35 et 40. Il existe plusieurs façons de dépouiller ce chat, en voici une:

SELECT 
Gender,
count(CASE WHEN Age> 9 AND Age <= 20 THEN 1 END) AS [10 - 20],
count(CASE WHEN Age> 20 AND Age <= 30 THEN 1 END) AS [21 - 30],
count(CASE WHEN Age> 30 AND Age <= 35 THEN 1 END) AS [31 - 35],
count(CASE WHEN Age> 35 AND Age <= 40 THEN 1 END) AS [36 - 40]
FROM Attendees AS AgeGroups
GROUP BY Gender
1
lonniect