SQL Server中的期初余额列

cyej8jka  于 2022-12-03  发布在  SQL Server
关注(0)|答案(1)|浏览(223)

我有一个按日期、帐号和项目编号收集正金额和负金额的事务处理表。我需要一个结果集,该结果集生成一个期初余额列,该列对运行查询的期间的起始日期之前的所有金额求和。我现在通过期初余额的函数来完成此操作,但对于一个3、000行的记录集(太长)。完成相同结果集的最佳方法是什么?
我目前的尝试

Select sftpUser.BeginBal(@startDate,a.ProjectID) as BeginBal,
    a.accountnum, a.AccountDesc, a.JournalRef, a.Projectid, a.ProjDesc, sum(a.amount) as PeriodAmount, b.donorstmtdesc as ProjectName,
    (case when substring(a.accountnum,4,4) in ('4000','4025','4900','4920','4930','4940','5060','5400') then 0 else 1 end) as Grp2,
    (case when substring(a.accountnum,4,4) in ('4000','4025') then 0
          when substring(a.accountnum,4,4) in ('4900','4920','4930','4940','5060','5400') then 1
                  when substring(a.accountnum,4,4) = '6000' then 2
          else 3 end) as RptLn
    from activity a
    left outer join sftpuser.projects b on a.ProjectID=b.projectid
    Where a.PostStatus='Posted' and a.PostDate between @startdate and @enddate and a.ProjectID in (Select ProjID from sftpUser.ProjectID_Split(@ProjID,','))
    Group by a.accountnum, a.AccountDesc, a.JournalRef, a.ProjectID, a.ProjDesc, b.donorstmtdesc

[sftpUser.BeginBal函数]创建函数[sftpUser].[BeginBal](@asof date,@项目ID as varchar(50))返回货币作为开始返回(从sftpUser.activity a中选择sum(a.amount)作为开始Bal,其中poststatus ='Posted'且PostDate〈@asof和a.项目ID =@项目id)
结束日期

[Activity Table]
|:ID:|:TransNum:|:PostStatus:|:journal:|:journalref|:accountnum:|:accountdesc:|:amount:|:projectID:|:projectdesc:|
|:1:|:6452-177:|:2022-01-07:|:Posted:|:Accounts Payable:|:St. Petersburg College-Vet Tech Dog Yard Re:|:02-6020-03:|:Capital Facilities Expenditures:|:400.00:|:DERBY CAP:|:Derby Lane Charity Day:|
|:2:|:6452-183:|:2022-01-07:|:Posted:|:Accounts Payable:|:Barnes & Noble College Booksellers, LLC-Book Awards 2021-22:|:02-6000-03:|:Scholarship Expenditures:|:    138.99:|:FND PARTNERS:|:Foundation Partners Group Scholarship Fund

[结果集]|:期初余额:|:帐号:|:帐户描述:|:日志参考:|:项目ID:|:项目描述:|:期间金额:|:项目名称:|:组2:|:报告输入:||:-297207.98美元|电话:01-4000-013|:捐款|:ACH WePay忠诚度匹配|:泰坦|:SPC泰坦基金|:-500个|:彼得堡学院泰坦基金:|0|:0个||:-297207.98美元|电话:01-4000-013|:捐款|信用卡分期付款|:泰坦|:SPC泰坦基金|:-250|:彼得堡学院泰坦基金:|0|:0个||:-297207.98美元| 电话:01-4000-013|:捐款|:调整批次6641 / 2022-165|:泰坦|:SPC泰坦基金|:-50|:彼得堡学院泰坦基金:|0|:0个||:-297207.98美元| 电话:01-4000-013|:捐款|:艾伦大卫个人支票|:泰坦|:SPC泰坦基金|:-30.78美元|:彼得堡学院泰坦基金:|0|:0个||:-297207.98美元| 电话:01-4000-013|:捐款|:AmazonSmile慈善个人支票|:泰坦|:SPC泰坦基金|:-75|:彼得堡学院泰坦基金:|0|:0个|

km0tfn4u

km0tfn4u1#

很明显,在你发布的查询中,有比你的问题所问的更多的内容。
如果没有示例数据,很难确定我们在这里使用的是什么,但这里有一种技术,它不使用标量函数,而是利用窗口函数。
第一个
实际上,我们将当前期间之前的所有内容分组(基于作为上一个期间结束的@LastPeriodDateTimeUTC变量),并将其累计到1行中。从那里,我们可以使用SUM()OVER按TransactionDateTimeUTC顺序为每个帐号计算运行总数。

相关问题