Utföra kumulativa beräkningar i SQL

Sidan uppdaterad :
Datum för skapande av sida :

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