这道题目要求我们分析不同还款能力级别的客户逾期情况,计算每个还款能力级别的客户中有逾期行为的客户占比,并按占比降序排序。下面是这个SQL查询的思路和实现步骤。
1. 确定总体问题
我们需要计算每个还款能力级别的客户中有逾期行为的客户占比。逾期行为的定义是overdue_days
字段不为NULL。
2. 分析关键问题
- 获取客户的还款能力:我们需要将
loan_tb
和customer_tb
表连接起来,以便获取每个客户的还款能力级别。 - 计算逾期客户占比:对于每个还款能力级别,计算有逾期行为的客户占比。
- 格式化输出:将逾期客户占比格式化为百分数,并保留一位小数。
3. 解决每个关键问题的代码及讲解
步骤1:获取客户的还款能力
我们使用JOIN
将loan_tb
和customer_tb
表连接起来:
FROM
loan_tb lt
JOIN
customer_tb ct ON lt.customer_id = ct.customer_id
ON lt.customer_id = ct.customer_id
:通过客户ID进行连接。
步骤2:计算逾期客户占比
我们使用CASE WHEN
语句来计算有逾期行为的客户数量,并计算占比:
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
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’字符串。
步骤3:分组和排序
我们按还款能力级别分组,并按逾期客户占比降序排序:
GROUP BY
ct.pay_ability
ORDER BY
overdue_ratio DESC
GROUP BY ct.pay_ability
:按还款能力级别分组。ORDER BY overdue_ratio DESC
:按逾期客户占比降序排序。
完整代码
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 lt
JOIN
customer_tb ct ON lt.customer_id = ct.customer_id
GROUP BY
ct.pay_ability
ORDER BY
overdue_ratio DESC