问题:
如对表:
/*==================================================== id |score |grade --------------------------------------------------- 1 |0 |1 2 |4 |1 3 |6 |2 4 |1 |2 5 |7 |3 6 |3 |3 ====================================================*/
希望统计各grade中score>5的数量
如果用如下语句:
1 select grade,count(*) from tmpTable where score>5 group by grade
则不能得到grade==1的结果,但实际是期望得到0的
分析:
造成这一现象的原因是, score<=5的情况都被首先剔除了,无法被group by
解决:
使用如下语句查询:
select a.grade,ifnull(count(*),0) from (select * from tmpTable group by grade) a left join ( select grade,count(*) from tmpTable where score>5 group by grade) b on a.grade=b.grade
原理:
借助另一个所期待行存在的“表”,通过左联,将期望的行select出来,再借助ifnull函数进行替换 以实现显示0
注意:不同数据库实现ifnull功能可能采用不同的函数,如NVL等。本例使用的数据库是sqlite,其他数据库未测试
原文:http://www.cnblogs.com/dusmos/p/5330974.html