SQL'de kümülatif hesaplamalar gerçekleştirme
özet
Tutarın yıl-ay birimleri cinsinden kümülatif değeri SQL kullanılarak hesaplanır.
İşlem denetimi sürümü
Desteklenen SQL Server sürümleri
- 2005
- 2008
- 2008 R2
SQL Server Sürümünü Kontrol Et
- 2005
- 2008
- 2008 R2
Test edilen Windows sürümü
- 2008
- 2008 R2
madde
Normalde, bir veritabanı kullanırken, para miktarı genellikle belirtilen yıl ve ay için hesaplanır, ancak bu ayın miktarının, miktar ve envanter gibi önceki ayın verilerine dayanarak eklendiği durumlar da vardır. Depolanan veya programlı olarak kümülatif değerleri hesaplayabilirsiniz, ancak şimdilik hesaplamayı yalnızca SQL'de yapmak istiyorum.
Aşağıda, her yıl ve ay için belirlenen tutarları içeren bir tablo bulunmaktadır:
Tutarı KümülatifYıl-Ay | Yıl-Birim Tutarı Kümülatif | ||
---|---|---|---|
201004 | 100 | sıfır | sıfır |
201005 | 200 | sıfır | sıfır |
201006 | 150 | sıfır | sıfır |
201007 | 300 | sıfır | sıfır |
201008 | 50 | sıfır | sıfır |
201009 | 220 | sıfır | sıfır |
201010 | 240 | sıfır | sıfır |
201011 | 280 | sıfır | sıfır |
201012 | 400 | sıfır | sıfır |
201101 | 450 | sıfır | sıfır |
201102 | 520 | sıfır | sıfır |
201103 | 120 | sıfır | sıfır |
201104 | 140 | sıfır | sıfır |
201105 | 450 | sıfır | sıfır |
201106 | 270 | sıfır | sıfır |
201107 | 640 | sıfır | sıfır |
201108 | 340 | sıfır | sıfır |
201109 | 230 | sıfır | sıfır |
201110 | 280 | sıfır | sıfır |
201111 | 320 | sıfır | sıfır |
201112 | 350 | sıfır | sıfır |
201201 | 230 | sıfır | sıfır |
201202 | 270 | sıfır | sıfır |
201203 | 350 | sıfır | sıfır |
SQL'de toplu olarak güncelleştirmek için, "önceki ayın tutarı" ifadesini "önceki ayın tutarı" olarak kullanmak yerine, geçmiş tutarın hedef yıl ve aydan toplanması koşulunu ekleyerek kümülatif değeri hesaplayabilirsiniz.
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.年月
Yukarıdaki SQL'i yürüttüğünüzde, kümülatif değer "Tutar Kümülatif" içine girilir.
Tutarı KümülatifYıl-Ay | Yıl-Birim Tutarı Kümülatif | ||
---|---|---|---|
201004 | 100 | 100 | sıfır |
201005 | 200 | 300 | sıfır |
201006 | 150 | 450 | sıfır |
201007 | 300 | 750 | sıfır |
201008 | 50 | 800 | sıfır |
201009 | 220 | 1020 | sıfır |
201010 | 240 | 1260 | sıfır |
201011 | 280 | 1540 | sıfır |
201012 | 400 | 1940 | sıfır |
201101 | 450 | 2390 | sıfır |
201102 | 520 | 2910 | sıfır |
201103 | 120 | 3030 | sıfır |
201104 | 140 | 3170 | sıfır |
201105 | 450 | 3620 | sıfır |
201106 | 270 | 3890 | sıfır |
201107 | 640 | 4530 | sıfır |
201108 | 340 | 4870 | sıfır |
201109 | 230 | 5100 | sıfır |
201110 | 280 | 5380 | sıfır |
201111 | 320 | 5700 | sıfır |
201112 | 350 | 6050 | sıfır |
201201 | 230 | 6280 | sıfır |
201202 | 270 | 6550 | sıfır |
201203 | 350 | 6900 | sıfır |
Ayrıca, kümülatif değeri her yıl sıfırlamak istiyorsanız, koşullu ifadeyi değiştirerek hesaplayabilirsiniz.
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.年月
Yukarıdaki SQL'i yürüttüğünüzde, kümülatif değer "Yıllık Tutar Kümülatif" içine girilir.
Tutarı KümülatifYıl-Ay | Yıl-Birim Tutarı Kümülatif | ||
---|---|---|---|
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 |