Utföra kumulativa beräkningar i SQL
sammanfattning
Det kumulativa värdet av beloppet i år-månadsenheter beräknas med SQL.
Version av åtgärdskontroll
SQL Server versioner som stöds
- 2005
- 2008
- 2008 R2
Kontrollera SQL Server version
- 2005
- 2008
- 2008 R2
Testad Windows-version
- 2008
- 2008 R2
substans
Normalt, när man använder en databas, beräknas mängden pengar ofta för det angivna året och månaden, men det finns också fall där beloppet för denna månad läggs till baserat på uppgifterna från föregående månad, till exempel belopp och lager. Du kan beräkna kumulativa värden lagrade eller programmatiskt, men för närvarande vill jag bara göra beräkningen i SQL.
Det finns en tabell nedan, med belopp som fastställs för varje år och månad:
År-månad | belopp | Kumulativt | år-enhetsbelopp Kumulativt |
---|---|---|---|
201004 | 100 | noll | noll |
201005 | 200 | noll | noll |
201006 | 150 | noll | noll |
201007 | 300 | noll | noll |
201008 | 50 | noll | noll |
201009 | 220 | noll | noll |
201010 | 240 | noll | noll |
201011 | 280 | noll | noll |
201012 | 400 | noll | noll |
201101 | 450 | noll | noll |
201102 | 520 | noll | noll |
201103 | 120 | noll | noll |
201104 | 140 | noll | noll |
201105 | 450 | noll | noll |
201106 | 270 | noll | noll |
201107 | 640 | noll | noll |
201108 | 340 | noll | noll |
201109 | 230 | noll | noll |
201110 | 280 | noll | noll |
201111 | 320 | noll | noll |
201112 | 350 | noll | noll |
201201 | 230 | noll | noll |
201202 | 270 | noll | noll |
201203 | 350 | noll | noll |
För att uppdatera i en batch i SQL, istället för att använda "beloppet för föregående månad" som "beloppet för föregående månad", kan du beräkna det kumulativa värdet genom att bifoga villkoret att det tidigare beloppet aggregeras från målåret och månaden.
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.年月
När du kör ovanstående SQL anges det kumulativa värdet i "Belopp kumulativt".
År-månad | belopp | Kumulativt | år-enhetsbelopp Kumulativt |
---|---|---|---|
201004 | 100 | 100 | noll |
201005 | 200 | 300 | noll |
201006 | 150 | 450 | noll |
201007 | 300 | 750 | noll |
201008 | 50 | 800 | noll |
201009 | 220 | 1020 | noll |
201010 | 240 | 1260 | noll |
201011 | 280 | 1540 | noll |
201012 | 400 | 1940 | noll |
201101 | 450 | 2390 | noll |
201102 | 520 | 2910 | noll |
201103 | 120 | 3030 | noll |
201104 | 140 | 3170 | noll |
201105 | 450 | 3620 | noll |
201106 | 270 | 3890 | noll |
201107 | 640 | 4530 | noll |
201108 | 340 | 4870 | noll |
201109 | 230 | 5100 | noll |
201110 | 280 | 5380 | noll |
201111 | 320 | 5700 | noll |
201112 | 350 | 6050 | noll |
201201 | 230 | 6280 | noll |
201202 | 270 | 6550 | noll |
201203 | 350 | 6900 | noll |
Om du vill återställa det kumulativa värdet varje år kan du dessutom beräkna det genom att ändra villkorsuttrycket.
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.年月
När du kör ovanstående SQL anges det kumulativa värdet i "Årligt belopp kumulativt".
År-månad | belopp | Kumulativt | år-enhetsbelopp Kumulativt |
---|---|---|---|
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 |