使用带有 ORDER BY 的 SQL Server 查找累积总和

Posted

技术标签:

【中文标题】使用带有 ORDER BY 的 SQL Server 查找累积总和【英文标题】:Finding cumulative sum using SQL Server with ORDER BY 【发布时间】:2020-04-22 13:39:57 【问题描述】:

试图计算一个给定数字的累积总和。 需要按 2 列订购:交货,日期。

查询:

SELECT Date, Delivery, Balance, SUM(Balance) OVER ( ORDER BY Delivery, Date) AS cumsum
FROM t

结果:

Contract_Date   Delivery    Balance cumsum
2020-02-25  2020-03-01  308.100000  308.100000
2020-03-05  2020-03-01  -2.740000   305.360000
2020-03-06  2020-04-01  176.820000  682.180000
2020-03-06  2020-04-01  200.000000  682.180000
2020-03-09  2020-04-01  300.000000  1082.180000
2020-03-09  2020-04-01  100.000000  1082.180000
2020-03-13  2020-04-01  129.290000  1211.470000
2020-03-16  2020-04-01  200.000000  1711.470000
2020-03-16  2020-04-01  300.000000  1711.470000
2020-03-17  2020-04-01  300.000000  2011.470000
2020-04-01  2020-04-01  86.600000   2098.070000
2020-04-03  2020-04-01  200.000000  2298.070000

预期结果:

Contract_Date   Delivery    Balance cumsum
25/2/2020   1/3/2020    308.1   308.1
5/3/2020    1/3/2020    -2.74   305.36
6/3/2020    1/4/2020    176.82  482.18
6/3/2020    1/4/2020    200     682.18
9/3/2020    1/4/2020    300     982.18
9/3/2020    1/4/2020    100     1082.18
13/3/2020   1/4/2020    129.29  1211.47
16/3/2020   1/4/2020    200     1411.47
16/3/2020   1/4/2020    300     1711.47
17/3/2020   1/4/2020    300     2011.47
1/4/2020    1/4/2020    86.6    2098.07
3/4/2020    1/4/2020    200     2298.07

版本: Microsoft SQL Server 2017

【问题讨论】:

【参考方案1】:

您需要在ORDER BY 子句中添加第三列来打破Contract_DateDelivery 的关系。您将使用哪一个并不明显。这是使用列Balance 的一个选项:

SELECT 
    Date, 
    Delivery, 
    Balance, 
    SUM(Balance) OVER ( ORDER BY Delivery, Contract_Date, Balance) AS cumsum
FROM t

【讨论】:

以上是关于使用带有 ORDER BY 的 SQL Server 查找累积总和的主要内容,如果未能解决你的问题,请参考以下文章

在 Toad for Sql Server 2016 中使用带有 Union All 的 Order By 子句时出现奇怪的语法错误

oracle 两个sql带有order by的使用union/union all的时候报错 'ORA-00933:sql命令未正确结束' 处理办法

带有 2 个表的 SQL Server GROUP BY

SQL语句中,为啥where子句不能使用列别名,而order by却可以?

sql ORDER BY 按特定顺序排列多个值?

JPA 和 SQL Server 的 ORDER BY 子句中的列无效