Realització de càlculs acumulatius en SQL
resum
El valor acumulat de l'import en unitats mensuals es calcula mitjançant SQL.
Versió de comprovació de l'operació
Versions compatibles de l'SQL Server
- 2005
- 2008
- 2008 R2
Comprova la versió de l'SQL Server
- 2005
- 2008
- 2008 R2
Versió provada del Windows
- 2008
- 2008 R2
substància
Normalment, quan s'utilitza una base de dades, la quantitat de diners sovint es calcula per a l'any i el mes especificats, però també hi ha casos en què l'import d'aquest mes s'afegeix en funció de les dades del mes anterior, com ara l'import i l'inventari. Podeu calcular valors acumulatius emmagatzemats o programàticament, però de moment vull fer el càlcul només en SQL.
A continuació hi ha una taula, amb imports fixats per a cada any i mes:
Import acumulat de la | unitat interanual acumulat | ||
---|---|---|---|
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 |
Per tal d'actualitzar en un lot en SQL, en lloc d'utilitzar "l'import del mes anterior" com "l'import del mes anterior", podeu calcular el valor acumulat adjuntant la condició que l'import passat s'afegeixi de l'any objectiu i del mes.
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.年月
Quan executeu l'SQL anterior, el valor acumulatiu s'introdueix a "Import acumulatiu".
Import acumulat de la | unitat interanual acumulat | ||
---|---|---|---|
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 |
A més, si voleu restablir el valor acumulatiu cada any, podeu calcular-lo canviant l'expressió condicional.
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.年月
Quan executeu l'SQL anterior, el valor acumulatiu s'introdueix a "Import acumulat anual".
Import acumulat de la | unitat interanual acumulat | ||
---|---|---|---|
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 |