SQL技术需求:汇总未来付款总额并单独展示当月付款金额
问题分析与SQL修正
原查询的核心问题:
- 完全没用到
TranDate字段来区分当月和未来月份,根本没法实现需求里的时间范围筛选 - 子查询和外层查询都错误地把
payments加入分组条件,导致同一ID下不同付款记录被拆分后重复求和,这就是当月付款金额算错的直接原因
修正后的SQL语句
SELECT ID, SUM(CASE WHEN TranDate >= DATE_TRUNC('month', CURRENT_DATE) THEN Payments ELSE 0 END) AS cum_fut_payments, SUM(CASE WHEN TranDate = DATE_TRUNC('month', CURRENT_DATE) THEN Payments ELSE 0 END) AS monthly_payments, Branch, Address, City, Country FROM table1 GROUP BY ID, Branch, Address, City, Country
关键说明
- 用
DATE_TRUNC('month', CURRENT_DATE)获取当前月份的起始日期(比如当前是4月,就得到'202X-04-01'),不同SQL方言可调整:MySQL用DATE_FORMAT(CURRENT_DATE, '%Y-%m-01'),SQL Server用DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) cum_fut_payments通过CASE语句筛选所有当前及未来月份的付款并求和monthly_payments仅筛选当月付款求和- 分组条件只保留
ID和基础字段(Branch、Address等),确保同一ID的基础字段唯一(若同一ID对应多个不同基础字段,需先确认数据一致性)
内容的提问来源于stack exchange,提问作者Arun.K
相关产品推荐
相关产品推荐

