with t1 as (

    select *

    from loan_tb

    where overdue_days>0

)

select pay_ability,concat((round(count(t1.customer_id)*100/count(c.customer_id),1)),'%') as overdue_ratio

from customer_tb c left join t1 on c.customer_id=t1.customer_id

group by pay_ability

order by overdue_ratio desc

首先使用cte,筛选出逾期的客户。

然后用所有客户的表和cte左连接, 左边是所有客户的数据,全部保留, 右边有结果的是匹配到的逾期客户,还有很多的null,是因为这部分客户没逾期,所以匹配不到, 也就是一开始的cte里面,这部分人已经被去掉了, 所以这边的左连接, 右表是null。

这题很明显是要按照group by pay_ability 的。计算的也是 该还款登记内有多少逾期客户的数量 / 该还款登记所有客户的数量,所以按照group by pay_ability 没有问题,这么思考也很顺畅。

此处, 有易错点,这里要百分数,该还款登记内有多少逾期客户的数量 / 该还款登记所有客户的数量 除完是整数,

应该这么写 该还款登记内有多少逾期客户的数量*100 / 该还款登记所有客户的数量。也就是count(t1.customer_id)*100/count(c.customer_id),不然精度会出现问题,导致最后的结果会出现漏。

round(数值,1) 表示取一位小数

concat(文本,'%') 表示在文本后加上%,也就是 文本%

这题主要是用到了left join的特性, 以及对group by的理解。