2009-05-27 18 views
3

In SQL habe ich eine Spalte namens "Antwort", und der Wert kann entweder 1 oder 2 sein. Ich muss eine SQL-Abfrage generieren, die die Anzahl der 1 und 2 für jeden Monat zählt. Ich habe die folgende Abfrage, aber es funktioniert nicht:SQL; Zählen Sie nur die in jeder Spalte angegebenen Werte

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`) 

Antwort

5

Versuchen Sie, die SUM-CASE Trick:

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 Zählen Variation davon ist die Verwendung von count (distinct case, wenn "answer" = 1 dann "answer_else null end"). Es ist nützlicher, wenn Sie Joins haben, die dieselben Zeilen mehr als einmal erscheinen lassen und Sie einen eindeutigen Wert in der Antwort haben (mit sum (1) wird es mehrmals für dieselbe Master-Zeile hinzugefügt). Nicht hilfreich in diesem Fall, aber erwähnenswert :) –

6

Ich würde Gruppe im Jahr, Monat und zusätzlich die Antwort selbst. Dies wird in zwei Zeilen pro Monat zur Folge haben: man die Erscheinungen für Antwort 1, und eine andere für Antwort 2 (es ist auch generische für zusätzliche Antwortwerte)

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

Gleiche Idee wie ich hatte. Ich bin mir sicher, dass es auch schneller ist. –

+0

Nette Idee, obwohl dies die Gesamtanzahl nicht zurückgeben würde – Andomar

+0

@Andomar: aus der Frage - "Ich muss eine SQL-Abfrage generieren, die die Menge von eins und zwei für jeden Monat zählt". Er hat nichts über das Zählen der Summe erwähnt (obwohl es in seiner Anfrage erscheint, ich vermute, es ist nur, weil es "einfach" ist). Das Zählen der Summe ist keine große Herausforderung, einfach die "Antwort" aus der GROUP BY und aus der SELECT entfernen. –

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 
Verwandte Themen