非Inactive状态合同8-10月总还款金额SQL查询需求
问题描述
现有contract和ledger两张表(结构如下),需要编写SQL查询,计算**合同状态不为"Inactive"**的每个contract_id在8、9、10月的总还款金额——总还款金额为该时间段内loan_amount的总和加上对应合同的interest。
contract表
| contract_id | total_loan | interest | contract_status |
|---|---|---|---|
| 111 | 150 | 50 | Active |
| 122 | 400 | 25 | Finished |
| 133 | 750 | 0 | Inactive |
| 144 | 550 | 50 | Active |
ledger表
| ledger_id | contract_id | due_date | loan_amount |
|---|---|---|---|
| 1jk | 111 | 2021-07-01 | 25 |
| 2pl | 111 | 2021-08-14 | 75 |
| 1bd | 111 | 2021-08-25 | 50 |
| 7mn | 122 | 2021-07-20 | 100 |
| 6gf | 122 | 2021-08-11 | 150 |
| 9kt | 122 | 2021-09-16 | 75 |
| 5sz | 122 | 2021-10-05 | 75 |
| 3am | 133 | 2021-10-18 | 750 |
| 8hw | 144 | 2021-09-22 | 550 |
预期输出:
| contract_id | total_repayment |
|---|---|
| 111 | 175 |
| 122 | 325 |
| 144 | 600 |
解决方案
以下SQL语句可实现需求:
SELECT c.contract_id, SUM(l.loan_amount) + c.interest AS total_repayment FROM contract c INNER JOIN ledger l ON c.contract_id = l.contract_id WHERE c.contract_status != 'Inactive' AND MONTH(l.due_date) BETWEEN 8 AND 10 GROUP BY c.contract_id, c.interest;
关键说明
- 表关联:用
INNER JOIN关联两张表,只保留有对应还款记录的非Inactive合同,匹配预期输出范围 - 日期筛选:
MONTH(l.due_date) BETWEEN 8 AND 10快速锁定8-10月的还款记录,也可替换为IN (8,9,10),效果一致 - 聚合计算:
SUM(l.loan_amount)统计目标月份的本金总和- 加上合同固定的
interest得到总还款金额 - 分组时必须包含
c.interest,避免SQL语法报错(如MySQL开启ONLY_FULL_GROUP_BY时)
结果验证
- 合同111:8月还款75+50=125,加利息50 → 175
- 合同122:8月150+9月75+10月75=300,加利息25 → 325
- 合同144:9月还款550,加利息50 → 600
完全匹配预期输出。
内容的提问来源于stack exchange,提问作者Enzo Austin
相关产品推荐
相关产品推荐

