Izvajanje kumulativnih izračunov v SQL
Povzetek
Kumulativna vrednost zneska v enomesečnih enotah se izračuna z SQL.
Različica preverjanja operacije
Podprte različice strežnika SQL Server
- 2005
- 2008
- 2008 R2
Preverjanje različice strežnika SQL Server
- 2005
- 2008
- 2008 R2
Testirana različica sistema Windows
- 2008
- 2008 R2
snov
Običajno se pri uporabi zbirke podatkov pogosto izračuna znesek denarja za določeno leto in mesec, obstajajo pa tudi primeri, ko se znesek tega meseca doda na podlagi podatkov prejšnjega meseca, kot sta znesek in zaloga. Lahko izračunate kumulativne vrednosti, shranjene ali programsko, vendar za zdaj želim narediti izračun samo v SQL.
Spodaj je tabela z zneski, določenimi za vsako leto in mesec:
Letni znesekznesek | Kumulativni | leta-enota Kumulativni znesek | |
---|---|---|---|
201004 | 100 | Null | Null |
201005 | 200 | Null | Null |
201006 | 150 | Null | Null |
201007 | 300 | Null | Null |
201008 | 50 | Null | Null |
201009 | 220 | Null | Null |
201010 | 240 | Null | Null |
201011 | 280 | Null | Null |
201012 | 400 | Null | Null |
201101 | 450 | Null | Null |
201102 | 520 | Null | Null |
201103 | 120 | Null | Null |
201104 | 140 | Null | Null |
201105 | 450 | Null | Null |
201106 | 270 | Null | Null |
201107 | 640 | Null | Null |
201108 | 340 | Null | Null |
201109 | 230 | Null | Null |
201110 | 280 | Null | Null |
201111 | 320 | Null | Null |
201112 | 350 | Null | Null |
201201 | 230 | Null | Null |
201202 | 270 | Null | Null |
201203 | 350 | Null | Null |
Če želite posodobiti paket v SQL, namesto da uporabite "znesek prejšnjega meseca" kot "znesek prejšnjega meseca", lahko izračunate kumulativno vrednost tako, da priložite pogoj, da je pretekli znesek združen iz ciljnega leta in meseca.
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.年月
Ko izvršite zgornji SQL, se kumulativna vrednost vnese v »Znesek kumulativen«.
Letni znesekznesek | Kumulativni | leta-enota Kumulativni znesek | |
---|---|---|---|
201004 | 100 | 100 | Null |
201005 | 200 | 300 | Null |
201006 | 150 | 450 | Null |
201007 | 300 | 750 | Null |
201008 | 50 | 800 | Null |
201009 | 220 | 1020 | Null |
201010 | 240 | 1260 | Null |
201011 | 280 | 1540 | Null |
201012 | 400 | 1940 | Null |
201101 | 450 | 2390 | Null |
201102 | 520 | 2910 | Null |
201103 | 120 | 3030 | Null |
201104 | 140 | 3170 | Null |
201105 | 450 | 3620 | Null |
201106 | 270 | 3890 | Null |
201107 | 640 | 4530 | Null |
201108 | 340 | 4870 | Null |
201109 | 230 | 5100 | Null |
201110 | 280 | 5380 | Null |
201111 | 320 | 5700 | Null |
201112 | 350 | 6050 | Null |
201201 | 230 | 6280 | Null |
201202 | 270 | 6550 | Null |
201203 | 350 | 6900 | Null |
Če želite vsako leto ponastaviti kumulativno vrednost, jo lahko izračunate tako, da spremenite pogojni izraz.
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.年月
Ko izvršite zgornji SQL, se kumulativna vrednost vnese v »Letni znesek kumulativen«.
Letni znesekznesek | Kumulativni | leta-enota Kumulativni znesek | |
---|---|---|---|
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 |