如何在SQL中计算credit limit与addl credit总和并延续累加值?
解决方案:实现带延续性的信用总额计算
原表格数据
| 账户编号 | 信用额度 | 额外信用 |
|---|---|---|
| 123 | 1000 | 500 |
| 123 | 1000 | |
| 123 | 1000 | |
| 456 | 2000 | 300 |
| 456 | 2000 | |
| 456 | 2000 | 200 |
| 456 | 2000 |
期望结果
| 账户编号 | 信用额度 | 额外信用 | 总信用额度 |
|---|---|---|---|
| 123 | 1000 | 500 | 1500 |
| 123 | 1000 | 1500 | |
| 123 | 1000 | 1500 | |
| 456 | 2000 | 300 | 2300 |
| 456 | 2000 | 2300 | |
| 456 | 2000 | 200 | 2200 |
| 456 | 2000 | 2200 |
场景一:Excel中实现
假设数据从第2行开始(表头在第1行),在D2(总信用额度列)输入以下公式,下拉填充即可:
=IF(A2<>A1, B2+IF(C2<>"",C2,0), IF(C2<>"", B2+C2, D1))
- 逻辑说明:
- 若当前行账户编号和上一行不同,重新计算总信用(信用额度+当前额外信用,无额外信用则加0)
- 若账户编号相同,优先用当前行的额外信用计算总额;无额外信用则沿用上行的总信用
场景二:SQL中实现(以MySQL为例)
方法1:使用窗口函数(MySQL 8.0+)
利用LAST_VALUE窗口函数获取当前账户分组内到当前行为止的最后一个非空额外信用,再和信用额度相加:
SELECT account_no AS 账户编号, credit_limit AS 信用额度, addl_credit AS 额外信用, credit_limit + COALESCE( LAST_VALUE(CASE WHEN addl_credit IS NOT NULL THEN addl_credit END) OVER (PARTITION BY account_no ORDER BY (SELECT NULL) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 0 ) AS 总信用额度 FROM your_table;
方法2:使用变量(兼容旧版MySQL)
通过变量记录当前账户的有效额外信用值,逐行计算:
SET @prev_account = '', @current_addl = 0; SELECT account_no AS 账户编号, credit_limit AS 信用额度, addl_credit AS 额外信用, credit_limit + CASE WHEN account_no != @prev_account THEN @current_addl := COALESCE(addl_credit, 0) WHEN addl_credit IS NOT NULL THEN @current_addl := addl_credit ELSE @current_addl END AS 总信用额度 FROM your_table ORDER BY account_no;
内容的提问来源于stack exchange,提问作者kalyan4uonly
相关产品推荐
相关产品推荐

