Melakukan pengiraan kumulatif dalam SQL
Ringkasan
Nilai kumulatif amaun dalam unit bulan tahun dikira menggunakan SQL.
Versi semakan operasi
Versi SQL Server yang Disokong
- 2005
- 2008
- 2008 R2
Semak Versi Pelayan SQL
- 2005
- 2008
- 2008 R2
Versi Windows yang diuji
- 2008
- 2008 R2
Bahan
Biasanya, apabila menggunakan pangkalan data, jumlah wang sering dikira untuk tahun dan bulan yang ditentukan, tetapi terdapat juga kes di mana jumlah bulan ini ditambah berdasarkan data bulan sebelumnya seperti jumlah dan inventori. Anda boleh mengira nilai kumulatif yang disimpan atau secara programatik, tetapi buat masa ini saya mahu melakukan pengiraan hanya dalam SQL.
Terdapat jadual di bawah, dengan jumlah yang ditetapkan untuk setiap tahun dan bulan:
Jumlah | Tahun Bulan | Kumulatif | Tahun-Unit Jumlah Kumulatif |
---|---|---|---|
201004 | 100 | Batal | Batal |
201005 | 200 | Batal | Batal |
201006 | 150 | Batal | Batal |
201007 | 300 | Batal | Batal |
201008 | 50 | Batal | Batal |
201009 | 220 | Batal | Batal |
201010 | 240 | Batal | Batal |
201011 | 280 | Batal | Batal |
201012 | 400 | Batal | Batal |
201101 | 450 | Batal | Batal |
201102 | 520 | Batal | Batal |
201103 | 120 | Batal | Batal |
201104 | 140 | Batal | Batal |
201105 | 450 | Batal | Batal |
201106 | 270 | Batal | Batal |
201107 | 640 | Batal | Batal |
201108 | 340 | Batal | Batal |
201109 | 230 | Batal | Batal |
201110 | 280 | Batal | Batal |
201111 | 320 | Batal | Batal |
201112 | 350 | Batal | Batal |
201201 | 230 | Batal | Batal |
201202 | 270 | Batal | Batal |
201203 | 350 | Batal | Batal |
Untuk mengemas kini dalam kumpulan dalam SQL, bukannya menggunakan "jumlah bulan sebelumnya" sebagai "jumlah bulan sebelumnya", anda boleh mengira nilai kumulatif dengan melampirkan syarat bahawa jumlah masa lalu diagregatkan dari tahun sasaran dan bulan.
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.年月
Apabila anda melaksanakan SQL di atas, nilai kumulatif dimasukkan dalam "Amaun Kumulatif".
Jumlah | Tahun Bulan | Kumulatif | Tahun-Unit Jumlah Kumulatif |
---|---|---|---|
201004 | 100 | 100 | Batal |
201005 | 200 | 300 | Batal |
201006 | 150 | 450 | Batal |
201007 | 300 | 750 | Batal |
201008 | 50 | 800 | Batal |
201009 | 220 | 1020 | Batal |
201010 | 240 | 1260 | Batal |
201011 | 280 | 1540 | Batal |
201012 | 400 | 1940 | Batal |
201101 | 450 | 2390 | Batal |
201102 | 520 | 2910 | Batal |
201103 | 120 | 3030 | Batal |
201104 | 140 | 3170 | Batal |
201105 | 450 | 3620 | Batal |
201106 | 270 | 3890 | Batal |
201107 | 640 | 4530 | Batal |
201108 | 340 | 4870 | Batal |
201109 | 230 | 5100 | Batal |
201110 | 280 | 5380 | Batal |
201111 | 320 | 5700 | Batal |
201112 | 350 | 6050 | Batal |
201201 | 230 | 6280 | Batal |
201202 | 270 | 6550 | Batal |
201203 | 350 | 6900 | Batal |
Di samping itu, jika anda ingin menetapkan semula nilai kumulatif setiap tahun, anda boleh mengiranya dengan menukar ungkapan bersyarat.
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.年月
Apabila anda melaksanakan SQL di atas, nilai kumulatif dimasukkan dalam "Jumlah Kumulatif Tahunan".
Jumlah | Tahun Bulan | Kumulatif | Tahun-Unit Jumlah Kumulatif |
---|---|---|---|
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 |