Efectuarea calculelor cumulative în SQL
rezumat
Valoarea cumulativă a sumei în unități an-lună se calculează utilizând SQL.
Versiunea de verificare a operațiunilor
Versiunile de SQL Server acceptate
- 2005
- 2008
- 2008 R2
Verificați versiunea de SQL Server
- 2005
- 2008
- 2008 R2
Versiune windows testată
- 2008
- 2008 R2
substanță
În mod normal, atunci când se utilizează o bază de date, suma de bani este adesea calculată pentru anul și luna specificate, dar există și cazuri în care suma acestei luni este adăugată pe baza datelor din luna anterioară, cum ar fi suma și inventarul. Puteți calcula valorile cumulative stocate sau programatic, dar deocamdată vreau să fac calculul numai în SQL.
Există un tabel mai jos, cu sume stabilite pentru fiecare an și lună:
Suma | pe lună a anului | cumulată | suma unitară de la an la an cumulată |
---|---|---|---|
201004 | 100 | zero | zero |
201005 | 200 | zero | zero |
201006 | 150 | zero | zero |
201007 | 300 | zero | zero |
201008 | 50 | zero | zero |
201009 | 220 | zero | zero |
201010 | 240 | zero | zero |
201011 | 280 | zero | zero |
201012 | 400 | zero | zero |
201101 | 450 | zero | zero |
201102 | 520 | zero | zero |
201103 | 120 | zero | zero |
201104 | 140 | zero | zero |
201105 | 450 | zero | zero |
201106 | 270 | zero | zero |
201107 | 640 | zero | zero |
201108 | 340 | zero | zero |
201109 | 230 | zero | zero |
201110 | 280 | zero | zero |
201111 | 320 | zero | zero |
201112 | 350 | zero | zero |
201201 | 230 | zero | zero |
201202 | 270 | zero | zero |
201203 | 350 | zero | zero |
Pentru a actualiza într-un lot în SQL, în loc să utilizați "valoarea lunii anterioare" ca "valoarea lunii anterioare", puteți calcula valoarea cumulativă atașând condiția ca suma trecută să fie agregată din anul țintă și luna.
update 金額集計Test
set 金額累計 = 累計
from
(
select
A.年月,
sum(B.金額) as 累計
from 金額集計Test A
left outer join 金額集計Test B
on B.年月 <= A.年月
group by A.年月
) as C
where 金額集計Test.年月 = C.年月
Când executați SQL de mai sus, valoarea cumulativă este introdus în "Suma cumulativă".
Suma | pe lună a anului | cumulată | suma unitară de la an la an cumulată |
---|---|---|---|
201004 | 100 | 100 | zero |
201005 | 200 | 300 | zero |
201006 | 150 | 450 | zero |
201007 | 300 | 750 | zero |
201008 | 50 | 800 | zero |
201009 | 220 | 1020 | zero |
201010 | 240 | 1260 | zero |
201011 | 280 | 1540 | zero |
201012 | 400 | 1940 | zero |
201101 | 450 | 2390 | zero |
201102 | 520 | 2910 | zero |
201103 | 120 | 3030 | zero |
201104 | 140 | 3170 | zero |
201105 | 450 | 3620 | zero |
201106 | 270 | 3890 | zero |
201107 | 640 | 4530 | zero |
201108 | 340 | 4870 | zero |
201109 | 230 | 5100 | zero |
201110 | 280 | 5380 | zero |
201111 | 320 | 5700 | zero |
201112 | 350 | 6050 | zero |
201201 | 230 | 6280 | zero |
201202 | 270 | 6550 | zero |
201203 | 350 | 6900 | zero |
În plus, dacă doriți să resetați valoarea cumulativă în fiecare an, o puteți calcula modificând expresia condițională.
update 金額集計Test
set 年度単位金額累計 = 累計
from
(
select
A.年月,
sum(B.金額) as 累計
from 金額集計Test A
left outer join 金額集計Test B
on B.年月 <= A.年月
and B.年月 >= case
when cast(right(A.年月, 2) as int) >= 4 then left(A.年月, 4) + N'04'
else cast(cast(left(A.年月, 4) as int) - 1 as nvarchar(4)) + N'04'
end
group by A.年月
) as C
where 金額集計Test.年月 = C.年月
Când executați SQL de mai sus, valoarea cumulativă este introdus în "Suma anuală cumulativă".
Suma | pe lună a anului | cumulată | suma unitară de la an la an cumulată |
---|---|---|---|
201004 | 100 | 100 | 100 |
201005 | 200 | 300 | 300 |
201006 | 150 | 450 | 450 |
201007 | 300 | 750 | 750 |
201008 | 50 | 800 | 800 |
201009 | 220 | 1020 | 1020 |
201010 | 240 | 1260 | 1260 |
201011 | 280 | 1540 | 1540 |
201012 | 400 | 1940 | 1940 |
201101 | 450 | 2390 | 2390 |
201102 | 520 | 2910 | 2910 |
201103 | 120 | 3030 | 3030 |
201104 | 140 | 3170 | 140 |
201105 | 450 | 3620 | 590 |
201106 | 270 | 3890 | 860 |
201107 | 640 | 4530 | 1500 |
201108 | 340 | 4870 | 1840 |
201109 | 230 | 5100 | 2070 |
201110 | 280 | 5380 | 2350 |
201111 | 320 | 5700 | 2670 |
201112 | 350 | 6050 | 3020 |
201201 | 230 | 6280 | 3250 |
201202 | 270 | 6550 | 3520 |
201203 | 350 | 6900 | 3870 |