Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪种方法是计算运行总数的最佳方法_C#_Sql_Architecture_Sql Server 2012 - Fatal编程技术网

C# 哪种方法是计算运行总数的最佳方法

C# 哪种方法是计算运行总数的最佳方法,c#,sql,architecture,sql-server-2012,C#,Sql,Architecture,Sql Server 2012,今天晚上,我一直在思考如何解决一个总金额的问题。我正在使用C和实体框架以及SQL Server 2012开发一个可以分析我的银行交易的应用程序 在数据库中,我创建了一个Payment表,其中包含以下属性: PaymentDate, FromAccountId, ToAccountId, Amount 后者的属性,数量,总是正的;事务的方向应根据AccountId和ToAccountId的属性确定 现在,我必须能够计算出任何给定时间的运行总数。例如,通过将月初的总余额减去月末的总余额,我可以推断

今天晚上,我一直在思考如何解决一个总金额的问题。我正在使用C和实体框架以及SQL Server 2012开发一个可以分析我的银行交易的应用程序

在数据库中,我创建了一个Payment表,其中包含以下属性:

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功能的信息非常有用。