我们一般用count函数进行简单的数量统计.例如查询某班数学成绩小于60的学生人数,可以直接用count加where统计出来,但是如果这个班所有学生的人数都大于60分则查询结果为空而不是0,并且如果要联合查询语文数学英语等各个科目的不及格人数,若某科查询结果为空则该科目将无任何显示,如果还要查询成绩在60-80,80-90等各个分数段人数...尽管我们可以用一些手段让count显示0但那会愈加麻烦.
此时我们想到可以通过sum函数用case when then或decode将符合条件的分数转换成个数来方便地实现范围统计.其中case when then既能进行单值转换,又能实现范围转换,是理想的实现方案;而decode的特性跟case when then相似,但似乎只能单值转换.这里就要进入正题--sum,decode,sign结合简单实现单值范围统计
1.单向范围的数量统计
例:统计score<60的人数
sum(decode(sign(score-60),-1,1,0))
2.区间范围的数量统计
例:统计score>=60 && score<=80的人数
sum(decode(sign((score-60)*(score-80)),-1,1,0,1,0))
当然此实现方法效率并不可观