Cumulatieve berekeningen uitvoeren in SQL
samenvatting
De cumulatieve waarde van het bedrag in jaar-maandeenheden wordt berekend met behulp van SQL.
Versie van de bewerkingscontrole
Ondersteunde SQL Server-versies
- 2005
- 2008
- 2008 R2
Sql Server-versie controleren
- 2005
- 2008
- 2008 R2
Geteste Windows-versie
- 2008
- 2008 R2
stof
Normaal gesproken wordt bij het gebruik van een database het geldbedrag vaak berekend voor het opgegeven jaar en de opgegeven maand, maar er zijn ook gevallen waarin het bedrag van deze maand wordt toegevoegd op basis van de gegevens van de vorige maand, zoals bedrag en inventaris. U kunt cumulatieve waarden opgeslagen of programmatisch berekenen, maar voor nu wil ik de berekening alleen in SQL uitvoeren.
Er is een tabel hieronder, met bedragen vastgesteld voor elk jaar en elke maand:
Jaar-maandbedrag | Cumulatief | jaar-eenheidsbedrag Cumulatief | |
---|---|---|---|
201004 | 100 | nul | nul |
201005 | 200 | nul | nul |
201006 | 150 | nul | nul |
201007 | 300 | nul | nul |
201008 | 50 | nul | nul |
201009 | 220 | nul | nul |
201010 | 240 | nul | nul |
201011 | 280 | nul | nul |
201012 | 400 | nul | nul |
201101 | 450 | nul | nul |
201102 | 520 | nul | nul |
201103 | 120 | nul | nul |
201104 | 140 | nul | nul |
201105 | 450 | nul | nul |
201106 | 270 | nul | nul |
201107 | 640 | nul | nul |
201108 | 340 | nul | nul |
201109 | 230 | nul | nul |
201110 | 280 | nul | nul |
201111 | 320 | nul | nul |
201112 | 350 | nul | nul |
201201 | 230 | nul | nul |
201202 | 270 | nul | nul |
201203 | 350 | nul | nul |
Om in een batch in SQL bij te werken, kunt u in plaats van "het bedrag van de vorige maand" te gebruiken als "het bedrag van de vorige maand", de cumulatieve waarde berekenen door de voorwaarde te verbinden dat het eerdere bedrag wordt geaggregeerd uit het doeljaar en de maand.
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.年月
Wanneer u de bovenstaande SQL uitvoert, wordt de cumulatieve waarde ingevoerd in "Bedrag cumulatief".
Jaar-maandbedrag | Cumulatief | jaar-eenheidsbedrag Cumulatief | |
---|---|---|---|
201004 | 100 | 100 | nul |
201005 | 200 | 300 | nul |
201006 | 150 | 450 | nul |
201007 | 300 | 750 | nul |
201008 | 50 | 800 | nul |
201009 | 220 | 1020 | nul |
201010 | 240 | 1260 | nul |
201011 | 280 | 1540 | nul |
201012 | 400 | 1940 | nul |
201101 | 450 | 2390 | nul |
201102 | 520 | 2910 | nul |
201103 | 120 | 3030 | nul |
201104 | 140 | 3170 | nul |
201105 | 450 | 3620 | nul |
201106 | 270 | 3890 | nul |
201107 | 640 | 4530 | nul |
201108 | 340 | 4870 | nul |
201109 | 230 | 5100 | nul |
201110 | 280 | 5380 | nul |
201111 | 320 | 5700 | nul |
201112 | 350 | 6050 | nul |
201201 | 230 | 6280 | nul |
201202 | 270 | 6550 | nul |
201203 | 350 | 6900 | nul |
Als u de cumulatieve waarde elk jaar opnieuw wilt instellen, kunt u deze bovendien berekenen door de voorwaardelijke expressie te wijzigen.
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.年月
Wanneer u de bovenstaande SQL uitvoert, wordt de cumulatieve waarde ingevoerd in "Jaarlijks bedrag cumulatief".
Jaar-maandbedrag | Cumulatief | jaar-eenheidsbedrag Cumulatief | |
---|---|---|---|
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 |