在GROUP BY中使用时,SQL QUERY-多个COUNT返回错误(相同)结果

时间:2013-01-16 18:01:08

标签: mysql select count group-by

我会简单地说明一下:

我有两个SQL表达式可以正常工作:

首先:

select count(*) as number1
 from T1
where DATE1>'2012-01-01' and DATE2<'2012-12-31'

结果:1​​3

select  count(*) as number2 
from T1
where DATE3>DATE2 and CURDATE()>DATE2

结果:5

但是,当我尝试在GROUP BY中插入这两个COUNTS时,我总是得到resulyt 13 !!!

SELECT NAME,
 COUNT(case when DATE1>'2012-01-01' and DATE2<'2012-12-31' then 1 else 0 end) as number1, 
COUNT (case when (DATE3>DATE2 and CURDATE()>DATE2) then 1 else 0 end) as number 2
from T1

我得到了结果:

NAME  NUMBER1  NUMBER2
A       5         5
B       4         4
C       4         4

但我应该得到:

NAME  NUMBER1  NUMBER2
A       5         4
B       4         0
C       4         1

所以列的SUM与前两个查询中的13和5相同。我究竟做错了什么? 谢谢

4 个答案:

答案 0 :(得分:4)

COUNT(expression)不计算空表达式。您可以通过将ELSE 0更改为ELSE NULL或将其删除来修改您的查询(ELSE NULL隐含CASE表达式):

SELECT name,
    COUNT(CASE WHEN date1 > '2012-01-01' AND date2 < '2012-12-31' 
              THEN 1 END
         ) AS number1, 
    COUNT(CASE WHEN date3 > date2 AND CURDATE() > date2 
              THEN 1 END
         ) AS number2
FROM T1 
GROUP BY name ;

答案 1 :(得分:1)

这里不要使用count.Use Sum。如果你想使用count,那么把else放在else而不是0

答案 2 :(得分:1)

尝试:

SELECT NAME,
(select count(*) from T1 where DATE1>'2012-01-01' and DATE2<'2012-12-31') AS number1,
(select count(*) from T1 where DATE3>DATE2 and CURDATE()>DATE2) AS number2
FROM T1
GROUP BY NAME

答案 3 :(得分:1)

试试这个:

SELECT name, 
       SUM(CASE WHEN DATE1>'2012-01-01' AND DATE2<'2012-12-31' THEN 1 ELSE 0 END) AS number1, 
       SUM(CASE WHEN (DATE3>DATE2 AND CURDATE()>DATE2) THEN 1 ELSE 0 END) AS number2 
FROM T1 GROUP BY name