2010-12-13 93 views
1

我有调查答案的表,是这样的:多选择在一个SQL语句

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

,我想创建一个查询,将让我这个表的结果汇总,让我设置相关的日期范围。 我下面的语句非常作品:

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) 

但我不知道如果我能做得更好,也应该在哪里添加日期范围过滤。

+1

你能指定要使用的服务器的类型? SQL Server,Oracle,MySQL等 – 2010-12-13 10:16:01

回答

2

从多刺的诺曼第一个查询会给出如下结果:

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

其中只有几组不同的结果。我假设你想按问题分组的总数是/否。在这种情况下,你必须做这样的事情:

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 

结果:

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

你可以使用:

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

或者,如果你想获得那些完全一样的结果:

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 

你实现“案”可能会有所不同,重要的是你可以设置一切你不想null,它不会被计数count():)