SQL统计问题:逾期贷款笔数COUNT统计失效、逾期率计算问题排查
问题原因
当前SQL统计逾期笔数错误的核心原因是COUNT()函数的计数逻辑为统计所有非NULL值:你写的CASE表达式无论days_delay > 30是否成立,都会返回1或0,二者均为非NULL值,最终COUNT统计的结果等于表内总行数,和总贷款笔数结果一致。
修正方案
有两种常用的正确写法可以实现逾期30天以上贷款笔数的统计:
- 调整CASE表达式的返回值,不满足条件时返回NULL(可直接省略ELSE分支,SQL默认不满足CASE条件时返回NULL),此时COUNT只会统计满足条件的行
- 使用
SUM()函数替代COUNT(),满足条件时累加1,不满足条件时累加0,最终求和结果就是符合要求的逾期笔数
另外需要注意:多数数据库的整数除法规则会自动舍弃小数位,计算逾期率时建议先将分子转为浮点型,避免比例计算结果为0的错误。
完整修正后代码
WITH cTE AS ( SELECT -- 写法1:用COUNT,省略ELSE分支,不满足条件返回NULL COUNT(CASE WHEN days_delay > 30 THEN 1 END) AS number, -- 写法2:用SUM,保留ELSE 0分支,两种写法二选一即可 -- SUM(CASE WHEN days_delay > 30 THEN 1 ELSE 0 END) AS number, COUNT(loan_id) AS total_loans FROM loan_aggregate ) SELECT number, total_loans, -- 乘以1.0转为浮点型,避免整数除法错误 (number * 1.0 / total_loans) AS default_rt FROM cTE
内容的提问来源于stack exchange,提问作者Youssef Fahmy
相关产品推荐
相关产品推荐

