SQL如何根据指定规则计算含月度利息的客户总交易金额
问题诊断
原SQL存在3处核心逻辑错误:
- 统计范围错误:豁免条件要求统计的是「存款交易」(amount为负)的累计金额和次数,原SQL把取款交易也纳入统计,完全不符合业务规则
- 累计存款计算错误:累计存款≥100美元是指所有存款金额的绝对值之和≥100,原SQL直接SUM(amount)混合了存取款,判断条件
SUM(amount) >=-100完全不成立 - 利息触发逻辑写反:仅不满足豁免条件时才需要加收5美元利息,原SQL写的是满足条件时加5,逻辑完全颠倒
正确实现思路
- 按月份分组统计每个月的三类数据:
- 当月所有交易的总金额
- 当月存款(amount<0)的累计金额(取绝对值)
- 当月存款的交易次数
- 判断是否满足豁免条件:存款累计≥100 且 存款次数≥3,不满足则总金额加5美元利息
- 最后汇总所有月份的金额得到客户总交易金额
正确SQL代码
版本1:带月度明细方便核对
WITH monthly_stats AS ( SELECT MONTH(Date) AS [Month], SUM(amount) AS total_trans_amount, SUM(CASE WHEN amount < 0 THEN -amount ELSE 0 END) AS total_deposit, COUNT(CASE WHEN amount < 0 THEN 1 END) AS deposit_count FROM customer_table GROUP BY MONTH(Date) ) SELECT SUM( CASE WHEN total_deposit >= 100 AND deposit_count >=3 THEN total_trans_amount ELSE total_trans_amount + 5 END ) AS final_total_amount FROM monthly_stats;
版本2:直接汇总一步计算
SELECT SUM( monthly_amount + CASE WHEN is_exempt = 1 THEN 0 ELSE 5 END ) AS final_total_amount FROM ( SELECT SUM(amount) AS monthly_amount, CASE WHEN SUM(CASE WHEN amount <0 THEN -amount ELSE 0 END) >=100 AND COUNT(CASE WHEN amount <0 THEN 1 END) >=3 THEN 1 ELSE 0 END AS is_exempt FROM customer_table GROUP BY MONTH(Date) ) t
结果验证
使用给定测试数据计算,最终总交易金额为1143.5,可通过月度明细自行核对逻辑正确性。
内容的提问来源于stack exchange,提问作者pvibe007
相关产品推荐
相关产品推荐

