C# 哪种方法是计算运行总数的最佳方法
今天晚上,我一直在思考如何解决一个总金额的问题。我正在使用C和实体框架以及SQL Server 2012开发一个可以分析我的银行交易的应用程序 在数据库中,我创建了一个Payment表,其中包含以下属性:C# 哪种方法是计算运行总数的最佳方法,c#,sql,architecture,sql-server-2012,C#,Sql,Architecture,Sql Server 2012,今天晚上,我一直在思考如何解决一个总金额的问题。我正在使用C和实体框架以及SQL Server 2012开发一个可以分析我的银行交易的应用程序 在数据库中,我创建了一个Payment表,其中包含以下属性: PaymentDate, FromAccountId, ToAccountId, Amount 后者的属性,数量,总是正的;事务的方向应根据AccountId和ToAccountId的属性确定 现在,我必须能够计算出任何给定时间的运行总数。例如,通过将月初的总余额减去月末的总余额,我可以推断
PaymentDate, FromAccountId, ToAccountId, Amount
后者的属性,数量,总是正的;事务的方向应根据AccountId和ToAccountId的属性确定
现在,我必须能够计算出任何给定时间的运行总数。例如,通过将月初的总余额减去月末的总余额,我可以推断出特定账户的余额。计算此运行总数将在应用程序中发挥重要作用,因此单个计算不会花费太长时间
我提出了4种策略来计算这个跑步总量:
使用存储过程,其中时间和帐户是输入参数。
计算应用程序中的运行总数因为我使用的是Entity Framework,所以计算实际上将在数据库中进行
创建一个表RunningTotal并为每个事务更新它。这种方法的缺点是我必须自己更新这个表,即更多的业务逻辑。
与选项3类似,但使用基于付款表的视图。这样,我就必须处理额外的业务逻辑。
问题是,我无法决定哪种方法是最好的。您的想法是什么?在SQL Server 2012、Oracle、Postgres、DB2和Teradata中,计算运行总数的最简单方法是使用累积和函数。以下是一个基本示例:
select PaymentDate, FromAccountId, ToAccountId, Amount,
sum(Amount) over (partition by FromAccountId, ToAccountId
order by PaymentDate
) as cumAMount
from payments;
我怀疑您想要一些稍微不同的东西,从->到中添加金额,从->到中减去金额。您也可以这样做,但语法更复杂:
select PaymentDate, FromAccountId, ToAccountId, Amount,
sum((case when FromAccountId < ToAccountId then Amount
else -Amount
end
)
) over
(partition by (case when FromAccountId < ToAccountId then FromAccountId else ToAccountId end),
(case when FromAccountId < ToAccountId then ToAccountId else FromAccountId end)
order by PaymentDate
) as cumAMount
from payments;
这只是根据方向在金额前面加上一个标志。然后进行聚合,使从AccountId到AccountId一起进行,而不考虑付款方向。所有这些选项都有优点和缺点。因此,这是一个意见的问题,所以这是离题的。您没有考虑的一个选项是选项3的变体,但使用数据库触发器更新运行总数。这可能是我会使用的,但这一切都取决于……对于SQL Server 2012,我将查看选项1,以便能够使用新的滞后和超前T-SQL函数,这将允许您非常轻松地计算运行总数。请参阅以获取解释,并获取各种技术(包括SQL Server 2012中引入的技术)的性能比较。感谢所有回复。因为我绝不是t-sql专家,所以您提供给我的有关sql Server 2012功能的信息非常有用。