2010-12-13 3 views
1

ich eine Tabelle von Umfrageantworten habe, so etwas wie:mehr wählen in einer SQL-Anweisung

date  | q1 | q2 | 
12/12/10 | yes | no | 
12/13/10 | no | no | 

und ich möchte eine einzelne Abfrage erstellen, die mir die Zusammenfassung der Ergebnisse dieser Tabelle erhalten wird, so dass ich Legen Sie den relevanten Zeitraum fest. ich folgende Aussage ziemlich Werke:

SELECT (SELECT Count(*) 
     FROM `survey` 
     WHERE q1='Yes') AS q1_yes, 
     (SELECT Count(*) 
     FROM `survey` 
     WHERE q1='No') AS q1_no, 
     (SELECT Count(*) 
     FROM `survey` 
     WHERE q2='Yes') AS q2_yes) 

Aber ich bin nicht sicher, ob ich das besser machen kann, und auch, wo Sie den Datumsbereich Filterung hinzuzufügen.

+1

Könnten Sie den Servertyp angeben Sie verwenden? SQL Server, Oracle, MySQL usw. –

Antwort

2

Die erste Abfrage von Spiny Norman wird ein Ergebnis wie folgt geben:

q1 q2 count(*) 
no yes 2 
yes no 1 
yes yes 1 

Welche Gruppen nur Paare von eindeutigen Ergebnissen. Ich nehme an, Sie möchten die Gesamtanzahl von Ja/Nein nach Frage gruppieren. In diesem Fall würden Sie so etwas zu tun haben:

SELECT 'q1' as Question, s1.q1 as Answer, count(*) as Count 
FROM survey s1 
WHERE date>='2010-10-01' AND date<'2010-10-30' 
GROUP BY q1 
UNION 
SELECT 'q2' as Question, q2 as Answer, count(*) as Count 
FROM survey 
WHERE date>='2010-10-01' AND date<'2010-10-30' 
GROUP BY q2 

Ergebnis:

Question Answer Count 
q1  no  2 
q1  yes  2 
q2  no  1 
q2  yes  3 
3

könnten Sie verwenden:

select q1, q2, count(*) 
from survey 
group by q1, q2 

Oder, wenn Sie diese exakt die gleichen Ergebnisse erhalten möchten:

select count(case when q1 = 'Yes' then q1 else null end) as q1_yes, 
     count(case when q1 = 'No' then q1 else null end) as q1_no, 
     count(case when q2 = 'Yes' then q2 else null end) as q2_yes 
from survey 

Ihre Implementierung von „Fall“ variieren kann, das Wichtigste ist, kann eingestellt werden, alles, was Sie nicht null wollen und es wird nicht gezählt von count() :)

Verwandte Themen