2013-05-24 24 views
5

Pencereleme işlevleriyle ilgili yardıma ihtiyacım var.SQL Server 2012 Pencereleme işlevi bir koşu toplamını hesaplamak için

Yakın zamanda sql 2012 pencere işlevleri ile uğraşıyorum. Bir pencerede toplamı ve bir pencerede çalışan toplamı hesaplayabileceğinizi biliyorum. Ama merak ediyordum; Bir önceki koşu toplamını, yani mevcut satırı içermeyen koşma toplamını hesaplamak mümkün mü? ROW veya RANGE argümanını kullanmanız gerektiğini ve CURRENT ROW seçeneği olduğunu biliyorum, ancak bir CURRENT ROW - I olması gereken bir sözdizimidir. ROW ve RANGE argümanları hakkındaki bilgim sınırlıdır, bu nedenle herhangi bir yardım minnetle karşılanacaktır.

Bu sorunun pek çok çözümü olduğunu biliyorum, ancak ROW, RANGE argümanlarını anlamaya çalışıyorum ve sorunun bunlarla çatlatılabileceğini düşünüyorum. Önceki koşu toplamını hesaplamak için olası bir yolu ekledim ama daha iyi bir yol olup olmadığını merak ediyorum. peşin

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 

Teşekkür

+1

hem [veritabanı yöneticileri] değil çapraz yazı Lütfen (http://dba.stackexchange.com/questions/42985/sql-windowing-function-to-create- a-running-total) ve burada cevap bir programcıdan dba perspektifinden farklı olabilir. –

cevap

20

Geçerli satırın değerini çıkarmak olabilir:

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

Ya syntax at MSDN ve ypercube's answer göre:

<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) 
İlgili konular