按年/按月滚动求和:多账户合并滚动余额实现问题
解决多账户余额累加及滚动总和计算问题
我来帮你搞定这个多账户合并余额+滚动累计的需求!你的单账户查询逻辑没问题,但多账户时结果没合并,核心原因是原查询的分组方式没先把同期间的多账户余额汇总,直接就计算滚动了。
问题出在哪?
原查询里GROUP BY fiscalperiod, BalanceAmt会把每个账户在同一会计期间的BalanceAmt作为单独行返回,窗口函数SUM(balanceamt) OVER(ORDER BY fiscalperiod)是对这些分散的行做累加,而不是先把同期间的所有账户余额加总再计算滚动,自然没法得到多账户合并后的结果。
正确的SQL写法
我们需要分两步走:先按会计期间汇总所有指定账户的总余额,再基于这个汇总结果计算滚动总和:
SELECT FiscalPeriod, PeriodTotal AS BalanceAmt, -- 保留你习惯的字段名 SUM(PeriodTotal) OVER(ORDER BY FiscalPeriod) AS RollingBalance FROM ( -- 第一步:按会计期间汇总所有目标账户的余额 SELECT FiscalPeriod, SUM(BalanceAmt) AS PeriodTotal FROM EpicorLive10.Erp.GLPeriodBal WHERE FiscalYear = '2018' AND BalanceAcct IN ('01260|0000|000', '第二个账户编码', '第三个账户编码') -- 在这里添加所有需要合并的账户 GROUP BY FiscalPeriod ) AS PeriodTotals ORDER BY FiscalPeriod;
逻辑说明
- 子查询
PeriodTotals会先把2018年每个会计期间内,所有指定账户的BalanceAmt加总,得到该期间的多账户总余额PeriodTotal。 - 外层查询再对每个期间的总余额做滚动累加:
SUM(PeriodTotal) OVER(ORDER BY FiscalPeriod)会严格按照会计期间的顺序,从第一个期间开始累加至当前期间,最终得到从年初到该期间的累计滚动余额RollingBalance。
这样返回的结果就是每个会计期间的多账户合并余额,以及对应的滚动累计余额啦~
内容的提问来源于stack exchange,提问作者C.Gilles
相关产品推荐
相关产品推荐

