Thực hiện tính toán tích lũy trong SQL
tóm tắt
Giá trị tích lũy của số tiền trong đơn vị tháng năm được tính bằng SQL.
Phiên bản kiểm tra hoạt động
Phiên bản SQL Server được hỗ trợ
- 2005
- 2008
- 2008 R2
Kiểm tra Phiên bản SQL Server
- 2005
- 2008
- 2008 R2
Phiên bản Windows đã được thử nghiệm
- 2008
- 2008 R2
chất
Thông thường, khi sử dụng cơ sở dữ liệu, số tiền thường được tính cho năm và tháng được chỉ định, nhưng cũng có những trường hợp số tiền của tháng này được thêm vào dựa trên dữ liệu của tháng trước như số tiền và hàng tồn kho. Bạn có thể tính toán các giá trị tích lũy được lưu trữ hoặc lập trình, nhưng hiện tại tôi chỉ muốn thực hiện tính toán trong SQL.
Có một bảng dưới đây, với số tiền được đặt cho mỗi năm và tháng:
Số tiền | tích lũy năm tích lũy | số tiền lũy kế của năm | |
---|---|---|---|
201004 | 100 | không | không |
201005 | 200 | không | không |
201006 | 150 | không | không |
201007 | 300 | không | không |
201008 | 50 | không | không |
201009 | 220 | không | không |
201010 | 240 | không | không |
201011 | 280 | không | không |
201012 | 400 | không | không |
201101 | 450 | không | không |
201102 | 520 | không | không |
201103 | 120 | không | không |
201104 | 140 | không | không |
201105 | 450 | không | không |
201106 | 270 | không | không |
201107 | 640 | không | không |
201108 | 340 | không | không |
201109 | 230 | không | không |
201110 | 280 | không | không |
201111 | 320 | không | không |
201112 | 350 | không | không |
201201 | 230 | không | không |
201202 | 270 | không | không |
201203 | 350 | không | không |
Để cập nhật theo lô trong SQL, thay vì sử dụng "số tiền của tháng trước" làm "số tiền của tháng trước", bạn có thể tính giá trị tích lũy bằng cách đính kèm điều kiện là số tiền trong quá khứ được tổng hợp từ năm mục tiêu và tháng.
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.年月
Khi bạn thực thi SQL ở trên, giá trị tích lũy được nhập vào "Tích lũy số tiền".
Số tiền | tích lũy năm tích lũy | số tiền lũy kế của năm | |
---|---|---|---|
201004 | 100 | 100 | không |
201005 | 200 | 300 | không |
201006 | 150 | 450 | không |
201007 | 300 | 750 | không |
201008 | 50 | 800 | không |
201009 | 220 | 1020 | không |
201010 | 240 | 1260 | không |
201011 | 280 | 1540 | không |
201012 | 400 | 1940 | không |
201101 | 450 | 2390 | không |
201102 | 520 | 2910 | không |
201103 | 120 | 3030 | không |
201104 | 140 | 3170 | không |
201105 | 450 | 3620 | không |
201106 | 270 | 3890 | không |
201107 | 640 | 4530 | không |
201108 | 340 | 4870 | không |
201109 | 230 | 5100 | không |
201110 | 280 | 5380 | không |
201111 | 320 | 5700 | không |
201112 | 350 | 6050 | không |
201201 | 230 | 6280 | không |
201202 | 270 | 6550 | không |
201203 | 350 | 6900 | không |
Ngoài ra, nếu bạn muốn đặt lại giá trị tích lũy hàng năm, bạn có thể tính toán nó bằng cách thay đổi biểu thức có điều kiện.
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.年月
Khi bạn thực hiện SQL trên, giá trị tích lũy được nhập vào "Tích lũy số tiền hàng năm".
Số tiền | tích lũy năm tích lũy | số tiền lũy kế của năm | |
---|---|---|---|
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 |