我会简单地说明一下:
我有两个SQL表达式可以正常工作:
首先:
select count(*) as number1
from T1
where DATE1>'2012-01-01' and DATE2<'2012-12-31'
结果:13
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相同。我究竟做错了什么? 谢谢
答案 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