انجام محاسبات تجمعی در SQL
خلاصه
مقدار تجمعی مقدار در واحدهای سال ماه با استفاده از SQL محاسبه می شود.
نسخه بررسی عملیات
پشتیبانی از نسخه های SQL سرور
- 2005
- 2008
- 2008 R2
بررسی SQL سرور نسخه
- 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 |