问题:

  如对表:

/*====================================================
id        |score        |grade
---------------------------------------------------
1      |0        |1
2      |4        |1
3       |6        |2
4      |1        |2
5      |7        |3
6      |3        |3
====================================================*/

  希望统计各grade中score>5的数量

  如果用如下语句:

 select grade,count(*) from tmpTable where score>5 group by grade

  则不能得到grade==1的结果,但实际是期望得到0的

分析:

  造成这一现象的原因是, score<=5的情况都被首先剔除了,无法被group by

解决:

  使用如下语句查询:

select a.grade,ifnull(count(*),)
from
(select * from tmpTable group by grade) a
left join
( select grade,count(*) from tmpTable where score> group by grade) b
on a.grade=b.grade

  原理:

    借助另一个所期待行存在的“表”,通过左联,将期望的行select出来,再借助ifnull函数进行替换 以实现显示0

    注意:不同数据库实现ifnull功能可能采用不同的函数,如NVL等。本例使用的数据库是sqlite,其他数据库未测试

05-11 09:29