Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Sql 基于数据列的运行总计_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 基于数据列的运行总计

Sql 基于数据列的运行总计,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一张临时表,上面有一个账户每天余额变化的结果 DateValue DailyAmount ---------- --------------------------------------- 2014-04-21 0.00 2014-04-22 606.28 2014-04-23 -70.00 2014-04-24 -86.96 2014-04-25 -101.01 2014-04-26 -27.00 2014-04-27 0.00 2014-04-28 -75.00 2014-04-29

我有一张临时表,上面有一个账户每天余额变化的结果

DateValue  DailyAmount
---------- ---------------------------------------
2014-04-21 0.00
2014-04-22 606.28
2014-04-23 -70.00
2014-04-24 -86.96
2014-04-25 -101.01
2014-04-26 -27.00
2014-04-27 0.00
2014-04-28 -75.00
2014-04-29 -12.00
2014-04-30 0.00
2014-05-01 -164.00
2014-05-02 -49.95
2014-05-03 0.00
2014-05-04 0.00
2014-05-05 -140.00
2014-05-06 538.23
2014-05-07 -70.00
2014-05-08 223.04
2014-05-09 0.00
2014-05-10 -50.00
2014-05-11 0.00
2014-05-12 -140.00
2014-05-13 -12.00
2014-05-14 0.00
2014-05-15 6179.81
我需要从这个表中选择,根据我拥有的期初余额变量添加一个运行余额

选择DateaddDAY,-1,Datefield并以某种方式连接到其自身安全吗

我失败的尝试错误的结果是:

SELECT DateValue, ISNULL(r.Amount,0) AS DailyAmount, SUM(ISNULL(r.Amount,0))
FROM calendar c
LEFT JOIN @Result r
ON r.TheDate = c.DateValue
LEFT JOIN @Result r2
ON r2.TheDate = DATEADD(day, -1, r.TheDate)
WHERE c.DateValue BETWEEN @Start AND @End
GROUP BY c.DateValue, r.Amount

SQL版本是Microsoft SQL Server 2008 R2 SP2

在SQL中获取运行总计的典型方法是使用相关子查询:

select r.*,
       (select sum(r2.DailyAmount)
        from @Result r2
        where r2.DateValue <= r.DateValue
       ) as CumSum
from @Result r;

您可能需要在子查询中添加其他条件,例如匹配客户。而且,SQL Server 2012直接支持累计总和。

对在上运行总计的不同策略进行了相当广泛的讨论

如果您只有每日条目,那么几乎任何解决方案都可以,因为性能不会成为问题。我会展示一些不同的东西,然后戈登只是为了它

;WITH x AS
(
    SELECT TOP 1 
        DateValue
       ,DailyAmount
       ,RunningTotal = DailyAmount
         FROM #Result
        ORDER BY DateValue ASC
    UNION ALL
    SELECT y.DateValue
       ,y.DailyAmount
       ,x.RunningTotal + y.DailyAmount
         FROM x 
        INNER JOIN 
        #Result y ON y.DateValue = DATEADD(DAY, 1, x.DateValue)
)
SELECT DateValue
      ,DailyAmount
      ,RunningTotal
    FROM x
    ORDER BY DateValue
OPTION (MAXRECURSION 10000)

您的SQL Server版本是什么?请通过添加您尝试的代码或期望的结果来澄清您的特定问题。正如目前所写的,很难准确地说出你在问什么。请参阅“如何寻求帮助”页面以澄清此问题。可能与此问题重复:哈姆雷特-这是2008 R2。@Craig。同时显示所提供数据的预期结果。完美!谢谢戈登,好的。它被称为相关子查询。Link-Gordon我检查过,如果日期不是按升序排列的,这个查询将不起作用。在这种情况下,有没有办法使您的查询仍然有效?您的@Result=我的销售表。我的查询创建表SALL[DateValue][datetime]NULL[DailyAmount][decimal]18,2 NULL插入销售订单中的销售选择前10*按DailyAmount描述选择*从销售选择r*,从销售r2中选择sumr2.DailyAmount,其中r2.DateValue@BoratSagdiyev。这应该与特定顺序中的日期无关。条件r2.DateValue@GordonLinoff-我发誓我看到了一些奇怪的输出。我找个时间拉小提琴,再检查一下。