select
    ct.pay_ability,
    CONCAT(
        ROUND(SUM(CASE WHEN lt.overdue_days is not null THEN 1 ELSE 0 END)/COUNT(*)*100,1),'%') as overdue_ratio
FROM
loan_tb as lt inner join customer_tb as ct 
on lt.customer_id = ct.customer_id
group by ct.pay_ability
ORDER BY overdue_ratio DESC

知识点

CASE WHEN lt.overdue_days IS NOT NULL THEN 1 ELSE 0 END:判断客户是否有逾期行为,overdue_days字段不为NULL即记作1,否则记作0。

SUM(...):计算有逾期行为的客户数量,即上一步记作1的客户数量。

COUNT(*):计算总客户数量。

ROUND(...,1):将结果四舍五入保留一位小数。

CONCAT(...,'%'):输出格式为‘数字’+‘%’,此处使用字符串操作,CONCAT(A,B)即将A字符串和B字符串连接成‘AB’字符串。