SQL Server 2012 Windowing 函数计算运行总计

Posted

技术标签:

【中文标题】SQL Server 2012 Windowing 函数计算运行总计【英文标题】:SQL Server 2012 Windowing function to calculate a running total 【发布时间】:2013-05-24 12:44:14 【问题描述】:

我需要一些关于窗口功能的帮助。

我最近一直在玩 sql 2012 窗口函数。我知道你可以计算一个窗口内的总和和一个窗口内的总和。但我想知道;是否可以计算以前的运行总计,即不包括当前行的运行总计?我假设您需要使用 ROW 或 RANGE 参数,并且我知道有一个 CURRENT ROW 选项,但我需要一个 CURRENT ROW - I 这是无效的语法。我对 ROW 和 RANGE 参数的了解有限,因此将不胜感激。

我知道这个问题有很多解决方案,但我希望了解 ROW、RANGE 参数,并且我认为可以通过这些解决问题。我已经包含了一种可能的方法来计算以前的运行总数,但我想知道是否有更好的方法。



USE AdventureWorks2012

SELECT s.SalesOrderID
    , s.SalesOrderDetailID
    , s.OrderQty
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID) AS RunningTotal
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
                         ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal
    -- Sudo code - I know this does not work
    --, SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
    --                   ORDER BY SalesOrderDetailID
    --                   ROWS BETWEEN UNBOUNDED PRECEDING 
    --                                   AND CURRENT ROW - 1) 
    -- AS  SudoCodePreviousRunningTotal
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY s.SalesOrderID
    , s.SalesOrderDetailID 
    , s.OrderQty

提前致谢

【问题讨论】:

请不要在database administrators 和这里发帖,除非答案可能与程序员与 dba 的观点不同。 【参考方案1】:

你可以减去当前行的值:

SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID
                      ORDER BY SalesOrderDetailID) - s.OrderQty

或者根据syntax at MSDN和ypercube's answer:

<window frame preceding> ::= 

    UNBOUNDED PRECEDING
  | <unsigned_value_specification> PRECEDING
  | CURRENT ROW

-->

SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID
                      ORDER BY SalesOrderDetailID
                      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)

【讨论】:

以上是关于SQL Server 2012 Windowing 函数计算运行总计的主要内容,如果未能解决你的问题,请参考以下文章

一文解读流式计算的windowing

sql server2012 安装问题

sql server 2012 r2怎么设置新用户

sql server2012密钥 用哪个

中文版sql server 2012是否只能够安装在中文版的windows server 2012上?

sql server 2012 一直卡在这