如何计算数据表中每月初重置为0的累计值 以利息累加计算为例
按月重置累计利息的SQL实现方案
你需要的是按自然月为周期的滚动累计计算,推荐优先使用标准SQL窗口函数实现,兼容性好且逻辑清晰,无需自定义变量:
支持窗口函数的数据库(MySQL 8.0+/SQL Server/PostgreSQL/Oracle通用方案)
核心逻辑是用PARTITION BY对同月份的数据做分区,每个分区内单独做累计求和:
SELECT report_date, Interest, SUM(Interest) OVER ( -- 按年月分区,每个月的计算独立,自动实现月初重置 PARTITION BY DATE_TRUNC('month', report_date) -- 按日期正序累加 ORDER BY report_date ASC ) AS Interest_Cummulative FROM 你的业务表名
注:不同数据库提取月份维度的函数略有差异,可以替换为对应语法:
- SQL Server:
DATEFROMPARTS(YEAR(report_date), MONTH(report_date), 1)- MySQL:
DATE_FORMAT(report_date, '%Y-%m')
不支持窗口函数的低版本数据库(变量方案修正)
你原来的变量方案存在逻辑冗余,且没有判断年月切换的逻辑,修正后写法如下(以SQL Server为例):
DECLARE @AI FLOAT = 0 DECLARE @last_year INT, @last_month INT SELECT report_date, Interest, -- 切换月份时重置累计值,否则累加 @AI = CASE WHEN YEAR(report_date) = @last_year AND MONTH(report_date) = @last_month THEN @AI + Interest ELSE Interest END, -- 更新上月记录值 @last_year = YEAR(report_date), @last_month = MONTH(report_date), @AI AS Interest_Cummulative FROM 你的业务表名 -- 必须按日期排序,否则累计逻辑会出错 ORDER BY report_date ASC
内容的提问来源于stack exchange,提问作者mohitkrrai
相关产品推荐
相关产品推荐

