إجراء العمليات الحسابية التراكمية في SQL
ملخص
يتم حساب القيمة التراكمية للمبلغ بوحدات شهر السنة باستخدام SQL.
إصدار التحقق من التشغيل
إصدارات SQL Server المعتمدة
- 2005
- 2008
- 2008 R2
التحقق من إصدار SQL Server
- 2005
- 2008
- 2008 R2
إصدار ويندوز الذي تم اختباره
- 2008
- 2008 R2
مادة
عادة ، عند استخدام قاعدة بيانات ، غالبا ما يتم حساب مبلغ المال للسنة والشهر المحددين ، ولكن هناك أيضا حالات يتم فيها إضافة مبلغ هذا الشهر بناء على بيانات الشهر السابق مثل المبلغ والمخزون. يمكنك حساب القيم التراكمية المخزنة أو برمجيا ، ولكن في الوقت الحالي أريد إجراء الحساب فقط في SQL.
يوجد أدناه جدول ، مع تحديد المبالغ لكل سنة وشهر:
السنة المبلغ التراكمي| الشهر | السنة وحدة المبلغ | التراكمي | |
|---|---|---|---|
| 201004 | 100 | صِفْر | صِفْر |
| 201005 | 200 | صِفْر | صِفْر |
| 201006 | 150 | صِفْر | صِفْر |
| 201007 | 300 | صِفْر | صِفْر |
| 201008 | 50 | صِفْر | صِفْر |
| 201009 | 220 | صِفْر | صِفْر |
| 201010 | 240 | صِفْر | صِفْر |
| 201011 | 280 | صِفْر | صِفْر |
| 201012 | 400 | صِفْر | صِفْر |
| 201101 | 450 | صِفْر | صِفْر |
| 201102 | 520 | صِفْر | صِفْر |
| 201103 | 120 | صِفْر | صِفْر |
| 201104 | 140 | صِفْر | صِفْر |
| 201105 | 450 | صِفْر | صِفْر |
| 201106 | 270 | صِفْر | صِفْر |
| 201107 | 640 | صِفْر | صِفْر |
| 201108 | 340 | صِفْر | صِفْر |
| 201109 | 230 | صِفْر | صِفْر |
| 201110 | 280 | صِفْر | صِفْر |
| 201111 | 320 | صِفْر | صِفْر |
| 201112 | 350 | صِفْر | صِفْر |
| 201201 | 230 | صِفْر | صِفْر |
| 201202 | 270 | صِفْر | صِفْر |
| 201203 | 350 | صِفْر | صِفْر |
من أجل التحديث دفعة في SQL ، بدلا من استخدام "مبلغ الشهر السابق" ك "مبلغ الشهر السابق" ، يمكنك حساب القيمة التراكمية عن طريق إرفاق الشرط الذي يتم فيه تجميع المبلغ السابق من السنة المستهدفة والشهر.
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.年月
عند تنفيذ SQL أعلاه، يتم إدخال القيمة التراكمية في "المبلغ التراكمي".
السنة المبلغ التراكمي| الشهر | السنة وحدة المبلغ | التراكمي | |
|---|---|---|---|
| 201004 | 100 | 100 | صِفْر |
| 201005 | 200 | 300 | صِفْر |
| 201006 | 150 | 450 | صِفْر |
| 201007 | 300 | 750 | صِفْر |
| 201008 | 50 | 800 | صِفْر |
| 201009 | 220 | 1020 | صِفْر |
| 201010 | 240 | 1260 | صِفْر |
| 201011 | 280 | 1540 | صِفْر |
| 201012 | 400 | 1940 | صِفْر |
| 201101 | 450 | 2390 | صِفْر |
| 201102 | 520 | 2910 | صِفْر |
| 201103 | 120 | 3030 | صِفْر |
| 201104 | 140 | 3170 | صِفْر |
| 201105 | 450 | 3620 | صِفْر |
| 201106 | 270 | 3890 | صِفْر |
| 201107 | 640 | 4530 | صِفْر |
| 201108 | 340 | 4870 | صِفْر |
| 201109 | 230 | 5100 | صِفْر |
| 201110 | 280 | 5380 | صِفْر |
| 201111 | 320 | 5700 | صِفْر |
| 201112 | 350 | 6050 | صِفْر |
| 201201 | 230 | 6280 | صِفْر |
| 201202 | 270 | 6550 | صِفْر |
| 201203 | 350 | 6900 | صِفْر |
بالإضافة إلى ذلك، إذا كنت ترغب في إعادة تعيين القيمة التراكمية كل عام، يمكنك حسابها عن طريق تغيير التعبير الشرطي.
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.年月
عند تنفيذ SQL أعلاه، يتم إدخال القيمة التراكمية في "المبلغ السنوي التراكمي".
السنة المبلغ التراكمي| الشهر | السنة وحدة المبلغ | التراكمي | |
|---|---|---|---|
| 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 |