2013-05-24 13 views
5

Potrzebuję pomocy z funkcjami okienkowania.Funkcja Windowing programu SQL Server 2012 do obliczania sumy całkowitej

Ostatnio korzystałem z funkcji sql 2012 windowing. Wiem, że możesz obliczyć sumę w oknie i sumę bieżącą w oknie. Ale zastanawiałem się; czy możliwe jest obliczenie poprzedniej sumy roboczej, tj. sumy całkowitej bez uwzględnienia bieżącego wiersza? Zakładam, że musiałbyś użyć argumentu ROW lub RANGE i wiem, że istnieje opcja CURRENT ROW, ale potrzebowałbym CURRENT ROW - I, która jest nieprawidłową składnią. Moja wiedza na temat argumentów ROW i RANGE jest ograniczona, więc każda pomoc zostanie z wdzięcznością przyjęta.

Wiem, że istnieje wiele rozwiązań tego problemu, ale staram się zrozumieć argumenty ROW, RANGE i zakładam, że problem może być z nimi pęknięty. Zawarłem jeden możliwy sposób obliczenia poprzedniej sumy, ale zastanawiam się, czy istnieje lepszy sposób.

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 

góry dzięki

+1

proszę nie przechodzą na stanowiska administratorów baz danych, zarówno [] (http://dba.stackexchange.com/questions/42985/sql-windowing-function-to-create- a-running-total) i tutaj, chyba że odpowiedź może różnić się od perspektywy programistów w stosunku do dba. –

Odpowiedz

20

mogła odjąć wartość bieżącego wiersza to:

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

lub zgodnie z syntax at MSDN i 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) 
Powiązane problemy