如何利用Age表引用范围在CASE表达式中统计逾期贷款?
问题分析与修正方案
原查询存在几个核心问题:
- 用逗号连接三张表时未指定
Age表与其他表的关联条件,导致产生大量无效的笛卡尔积数据 - 子查询的
GROUP BY Age不符合SQL语法规则,SELECT中的LoanID和AgeBand既未被聚合,也未包含在GROUP BY列表中 - 错误的分组逻辑导致仅能返回部分年龄段的数据
修正后的SQL语句
SELECT a.AgeID AS AgeBand, COUNT(l.LoanID) AS "Number of loans" FROM Age a LEFT JOIN ( -- 先筛选逾期贷款并关联客户信息,拿到客户年龄 SELECT l.LoanID, c.Age FROM Loan l INNER JOIN Client c ON l.CustomerID = c.CustomerID WHERE l.PastDue_Days >= 1 ) AS overdue_loans ON overdue_loans.Age > a.Low_Value AND overdue_loans.Age <= a.High_Value GROUP BY a.AgeID ORDER BY a.Low_Value;
逻辑说明
- 子查询部分:先从
Loan表筛选出逾期(PastDue_Days >=1)的记录,通过CustomerID关联Client表,拿到每个逾期贷款对应的客户年龄,确保只处理有效逾期数据。 - 主查询关联Age表:用
LEFT JOIN关联Age表,通过年龄区间条件匹配对应的年龄段,使用LEFT JOIN可保证即使某个年龄段没有逾期贷款,也会显示该年龄段并统计数量为0。 - 分组统计:按
AgeID(即AgeBand)分组,统计每个年龄段的逾期贷款数量,最后按Low_Value排序,保证结果按年龄段顺序展示。
如果只需要显示有逾期贷款的年龄段,可把LEFT JOIN换成INNER JOIN。
内容的提问来源于stack exchange,提问作者Fliwolf Gaming
相关产品推荐
相关产品推荐

