2009-05-27 4 views
3

En SQL j'ai une colonne appelée "réponse", et la valeur peut être 1 ou 2. J'ai besoin de générer une requête SQL qui compte le nombre de 1 et 2 pour chaque mois. J'ai la requête suivante, mais il ne fonctionne pas:SQL; Ne compter que les valeurs spécifiées dans chaque colonne

SELECT MONTH(`date`), YEAR(`date`),COUNT(`answer`=1) as yes, 
COUNT(`answer`=2) as nope,` COUNT(*) as total 

FROM results 

GROUP BY YEAR(`date`), MONTH(`date`) 

Répondre

5

Essayez l'affaire SUM-CASE:

SELECT 
    MONTH(`date`), 
    YEAR(`date`), 
    SUM(case when `answer` = 1 then 1 else 0 end) as yes, 
    SUM(case when `answer` = 2 then 1 else 0 end) as nope, 
    COUNT(*) as total 
FROM results 
GROUP BY YEAR(`date`), MONTH(`date`) 
+0

A la variation de ceci est d'utiliser count (cas distinct quand 'answer' = 1 puis' answer'else null end). Il est plus utile lorsque vous avez des jointures que les mêmes lignes apparaissent plusieurs fois et que vous ayez une valeur distincte dans la réponse (l'utilisation de sum (1) l'ajoute plusieurs fois pour la même ligne principale). Pas utile dans ce cas, mais mérite d'être mentionné :) –

6

Je grouperait par l'année, le mois, et en plus la réponse elle-même. Cela se traduira par deux lignes par mois: un comptage des apparitions pour la réponse 1, et une autre pour la réponse 2 (il est aussi générique pour les valeurs de réponse supplémentaires)

SELECT MONTH(`date`), YEAR(`date`), answer, COUNT(*) 
FROM results 
GROUP BY YEAR(`date`), MONTH(`date`), answer 
+0

Même idée que j'avais. Je suis sûr que c'est aussi plus rapide. –

+0

Bonne idée, bien que cela ne renverrait pas le nombre total – Andomar

+0

@Andomar: de la question - "j'ai besoin de générer une requête SQL qui compte la quantité de un et deux pour chaque mois". Il n'a rien dit sur le total (bien qu'il apparaisse dans sa requête, je suppose que c'est juste parce que c'est "facile"). Compter le total n'est pas un gros challenge, il suffit de retirer la "réponse" du GROUP BY et du SELECT. –

0
SELECT year, 
     month, 
     answer 
     COUNT(answer) AS quantity 
FROM results 
GROUP BY year, month, quantity 
 
year|month|answer|quantity 
2001| 1|  1|  2 
2001| 1|  2|  1 
2004| 1|  1|  2 
2004| 1|  2|  2 
SELECT * FROM results; 
 
year|month|answer 
2001| 1|  1 
2001| 1|  1 
2001| 1|  2 
2004| 1|  1 
2004| 1|  1 
2004| 1|  2 
2004| 1|  2 
Questions connexes