Suma narastająco w sql

W tym wpisie pokażę prosty sposób na wyliczenie sumy narastająco dla każdego rekordu.

Sumę narastająco dzięki funkcji okna możemy teraz bardzo łatwo policzyć i to dla dowolnej partycji zestawu danych.

Korzystając z bazy NORTHWND robię prostą kwerendę pokazującą OrderID, CustomerID oraz rok i liczę wartość total dla każdej linii. Oto skrypt:

select o.OrderID, CustomerID, year(OrderDate) as rok,
UnitPrice * Quantity as total
from Orders o inner join [Order Details] od on
o.OrderID = od.OrderID

W wyniku działania otrzymałem:

Dodam teraz numer wiersza dla każdego rekordu.  Ważnym elementem funkcji ROW_NUMBER jest funkcja okna OVER(). Oto kod:

select o.OrderID, CustomerID, year(OrderDate) as rok,
UnitPrice * Quantity as total,
row_number() over(order by o.OrderID) as lp
from Orders o inner join [Order Details] od on
o.OrderID = od.OrderID

Oto wynik działania kwerendy:

A teraz dodam sumę narastająco korzystając jednocześnie z CTE. Zastosowanie CTE (common table expresion) znacznie ułatwia pisanie kwerendy. Jednocześnie CTE nie wpływa na wydajność kwerendy. Oto kod:

with cte as
(
select o.OrderID, CustomerID, year(OrderDate) as rok,
UnitPrice * Quantity as total,
row_number() over(order by o.OrderID) as lp
from Orders o inner join [Order Details] od on
o.OrderID = od.OrderID
)
select OrderID, CustomerID, rok, total,
sum(total) over(partition by (select 0) order by lp) as rt
from cte

I wynik:

Odpowiedz

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>