欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 计算帐户每月余额,补齐缺失日期:从 SQL 到 SPL

计算帐户每月余额,补齐缺失日期:从 SQL 到 SPL

2025/9/24 17:23:00 来源:https://blog.csdn.net/smilejingwei/article/details/144886239  浏览:    关键词:计算帐户每月余额,补齐缺失日期:从 SQL 到 SPL

MSSQL 数据库有个资产账户的流水表,日期不连续。

NameDateDebitCredit
A2021-01-01100
A2021-01-0190
A2021-02-01110
A2021-03-01050
A2021-04-01300
B2021-01-01100
B2022-02-01012
B2022-03-01050
B2024-04-0130

现在要统计从期初 2021 年 1 月到期末 2024 年 4 月每个账户每个月的余额,缺失的月份要补齐。

NameymBlance
A20211-19
A20212-30
A2021320
A20214-10
A20215-10
A20243-10
A20244-10
B20211-10
B20212-10
B20221-10
B202222
B2022352
B2022452
B2024352
B2024449

SQL 解法:

WITH Accounts AS (SELECT DISTINCT Name FROM trans
),
Months AS (SELECT DATEADD(MONTH, n, '2021-01-01') AS MonthStartFROM (SELECT TOP (DATEDIFF(MONTH, '2021-01-01', '2024-04-01') + 1) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS nFROM master.dbo.spt_values) AS Numbers
),
AccountMonths AS (SELECT a.Name, m.MonthStartFROM Accounts aCROSS JOIN Months m
),
Changes as (SELECT Name, DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0) as ym,sum(Credit - Debit) as change FROM trans group by Name, DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0)
),
fullChanges as (SELECT A.Name,A.MonthStart,c.change FROM AccountMonths a left join Changes c on a.Name=c.Name and a.MonthStart=c.ym
)
SELECT Name,YEAR(MonthStart) AS Y,MONTH(MonthStart) AS M,SUM(change) OVER (PARTITION BY Name ORDER BY MonthStart) AS balanceFROM fullChanges

SQL没有方便的方法生成月份序列,要用嵌套查询+窗口函数,代码非常复杂。

SPL提供了生成日期序列的函数,包括连续月份。

 A
1=mssql.query("select Name, DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0)as ym,sum(Credit - Debit) as change from trans group by Name, DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0)”)
2=periods@m(date("2021-01-01"),date("2024-04-01"),1)
3=xjoin(A1.id(Name):Name; A2:ym)
4=A3.join(Name:ym, A1:Name:ym,change)
5=A4.new(Name,year(ym):y,month(ym):m,change+if(Name==Name[-1] , Balance[-1]):Balance)

A1:查询数据库,按账户、每月第1天的日期分组,统计每月金额变化。

A2:生成每月第一天组成的连续序列。perionds生成日期序列,@m表示间隔单位为月份。

A3:将账户和日期序列进行叉乘。

A4:将叉乘结果和A1左关联。

A5:当前账号与上一条记录相比不变时,当月余额=当月金额变化+上个月的余额;账号变化时,当月余额重置为当月金额变化。

SPL已开源免费,欢迎前往乾学院了解更多!

源码地址

免费下载

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词