我们在做大屏项目的时候,会用到很多统计的功能,最常见的功能就是统计数量,比如有一个注册功能,要统计有多少条记录通过审核,多少条记录没通过审核,审核通过率是多少等等,最常用的统计sql语句如下,使用count(*)来统计,这种方式优点是简单,缺点是没法一次性统计出所有数据,性能比较差
sql">select count(*) as totalNum from external_user_register where check_status = 1
优化型sql
这种sql可以一次性统计出你想要的数据,由于只要执行一次,效率也比上面那种要好,这条sql的原理是通过sum来统计,比如sum(1)的意思是external_user_rgister有几条数据,就会加几个1,就可以统计出总数量,统计通过数量可以通过case来,如果check_status是1则返回1否则返回0,再通过sum来累加1的数量就可以计算出通过数
sql">select sum(1) as totalNum,sum(case when (check_status = 1) then 1 else 0 end) as passNum,sum(case when (check_status = 2) then 1 else 0 end) as rejectNum
from external_user_register
注意点
使用sum有个缺点就是如果表中一条数据也没回会返回null,不像count(*)即时没数据也会返回0,你可以在代码层面处理,也可以使用ifnull函数,ifnull如果遇到null会返回你指定的值
sql">select ifnull(sum(1),0) as totalNum,ifnull(sum(case when (check_status = 1) then 1 else 0 end),0) as passNum,ifnull(sum(case when (check_status = 2) then 1 else 0 end),0) as rejectNum
from external_user_register
计算通过率
我们使用hutool工具的NumberUtil计算通过率,浮点数计算都使用BigDecimal,避免精度问题,计算前要判断下分母不能为0,我们先用passNum除以totalNum,保留两位小数,再乘以100就是百分比,最后setScale(0)就是不保留小数
if (!externalUserStatis.getTotalNum().equals(0)) {BigDecimal passRatio = NumberUtil.div(externalUserStatis.getPassNum(), externalUserStatis.getTotalNum(), 2, RoundingMode.DOWN).multiply(BigDecimal.valueOf(100)).setScale(0);externalUserStatis.setPassRatio(passRatio);
}