2010-12-13 48 views
1

J'ai une table de réponses de l'enquête, quelque chose comme:sélection multiple dans une instruction SQL

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

et je voudrais créer une requête qui me obtenir les résultats résumé de ce tableau, me permettant de définir la plage de dates pertinente. Je déclaration suivante fonctionne à peu près:

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) 

Mais je ne sais pas si je peux faire mieux que ça, et aussi où ajouter le filtrage de plage de dates.

+1

Pouvez-vous préciser le type de serveur que vous utilisez? SQL Server, Oracle, MySQL, etc. –

Répondre

2

La première requête de spiny norman donnera un résultat comme celui-ci:

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

Qui regroupe uniquement des couples de résultats distincts. Je suppose que vous voulez regrouper le nombre total de oui/non par question. Dans ce cas, vous auriez à faire quelque chose comme ça:

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 

Résultat:

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

Vous pouvez utiliser:

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

Ou, si vous voulez obtenir les mêmes résultats:

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 

Votre mise en œuvre de « cas » peut varier, la chose importante est que vous pouvez définir tout ce que vous ne voulez pas annuler et il ne sera pas compté par count() :)