Kumulative Berechnungen in SQL durchführen
Zusammenfassung
Der kumulierte Wert des Betrags in Jahres-Monat-Einheiten wird mit SQL berechnet.
Version der Betriebsprüfung
Unterstützte SQL Server-Versionen
- 2005
- 2008
- 2. R2 2008
Überprüfen der SQL Server-Version
- 2005
- 2008
- 2. R2 2008
Getestete Windows-Version
- 2008
- 2. R2 2008
Substanz
Normalerweise wird bei der Verwendung einer Datenbank der Geldbetrag oft für das angegebene Jahr und den angegebenen Monat berechnet, aber es gibt auch Fälle, in denen der Betrag dieses Monats basierend auf den Daten des Vormonats wie Betrag und Inventar hinzugefügt wird. Sie können kumulative Werte berechnen, die gespeichert oder programmgesteuert gespeichert sind, aber im Moment möchte ich die Berechnung nur in SQL durchführen.
Es gibt eine Tabelle unten, mit Beträgen, die für jedes Jahr und jeden Monat festgelegt sind:
Jahr-Monat-Betrag | Kumulativ | Jahr-Einheit Betrag kumulativ | |
---|---|---|---|
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 |
Um in einem Batch in SQL zu aktualisieren, können Sie den kumulativen Wert berechnen, indem Sie nicht "den Betrag des Vormonats" als "den Betrag des Vormonats" verwenden, indem Sie die Bedingung anhängen, dass der vergangene Betrag aus dem Zieljahr und dem Monat aggregiert wird.
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.年月
Wenn Sie den obigen SQL-Code ausführen, wird der kumulative Wert unter "Betrag kumulativ" eingegeben.
Jahr-Monat-Betrag | Kumulativ | Jahr-Einheit Betrag kumulativ | |
---|---|---|---|
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 |
Wenn Sie den kumulativen Wert jedes Jahr zurücksetzen möchten, können Sie ihn außerdem berechnen, indem Sie den bedingten Ausdruck ändern.
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.年月
Wenn Sie den obigen SQL-Code ausführen, wird der kumulative Wert unter "Annual Amount Cumulative" eingegeben.
Jahr-Monat-Betrag | Kumulativ | Jahr-Einheit Betrag kumulativ | |
---|---|---|---|
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 |