محتویات سایت
        برچسب های محبوب 








 
   چالش: محاسبه سود بانکی
 
   T-SQL Challenges
   ۲۰۸۶۹
   این مقاله حاوی فایل ضمیمه نمی باشد
   محمد سلیم آبادی
   ۱۳۹۱/۲/۴
نسخه قابل چاپ نسخه قابل چاپ

مقدمه

انواع مختلفی از سپرده گذاری در بانک ها وجود دارد که یکی از آنها سپرده گذاری "مدت دار" هست که جهت دریافت سود از بانک افتتاح می شود. انواع مختلفی از این نوع سپرده وجود دارد که ما نوع کوتاه مدت آن را مورد بررسی قرار می دهیم. در این نوع حساب ها مشتری می تواند در طول ماه از حساب خود برداشت یا به آن واریز داشته باشد. سود روزانه بر اساس حد اقل مانده حساب محاسبه شده و در آخر ماه (عموما 30 ام هر ماه) به حساب مشتری واریز می شود. منظور از حداقل مانده این است که اگر موجودی حساب شما در یک روز نوسان داشته باشد پایین ترین مبلغ در محاسبه سود لحاظ می شود. مثلا اگر مبلغ اولیه 50 باشد و 50 تا به حساب واریز و 75 تا از حساب کم آنگاه مبلغ 25 به عنوان اساس محاسبه سود آن روز لحاظ می شود.

مساله

با داشتن اطلاعاتی راجب تراکنش های مشتریان یک بانک ما باید سود تعلق یافته به آنها را محاسبه کنیم. داده ها در قالب یک جدول ارائه داده شدن. ستون ها شامل: شماره حساب - شماره سند - تاریخ تراکنش - مبلغ واریز/برداشت. تعدادی داده به عنوان نمونه در زیر قابل مشاهده است که همگی برای یک مشتری هستند:

مبلغ

تاریخ

شماره سند

شماره حساب

+30

29/12/89

0

1

+75

01/01/90

1

1

+50

05/01/90

2

1

-25

05/01/90

3

1

-10

10/01/90

4

1

-5

15/01/90

5

1

+15

25/01/90

6

1

+15

25/01/90

7

1

25

25/01/90

8

1

وظیفه بدست آوردن سود ماه جاری (در اینجا فروردین) است. سود ماه قبل آن نیز بایستی در تاریخ 30 اسفند سال 89 واریز می شد از آنجایی که سود ناچیز و اعشاری بود از آن صرف نظر کردم. ولی در جهان واقع اینگونه نیست.

با کمک نمودار سعی در تفهیم مساله و چگونگی محاسبه سود بر اساس حد اقل مانده می کنیم.

اگر مثلا سود بانکی سالانه 6 درصد برای این نوع حساب ها باشد، با بدست آوردن مساحت قسمت هاشور زده و ضرب آن با سود تعلق گرفته به یک روز (6درصد تقسیم بر 360)، سود نهایی بدست می آید.

و اکنون اگر بخواهید به ازای هر شماره حساب و با احتساب فرودرین 90 به عنوان ماه جاری و 6 درصد سود سالیانه سود تعلق یافته به هر شماره حساب را بدست آوردید از چه الگوریتم و روشی استفاده می کنید؟

با فرض داده های مثال زده شده سود تعلق یافته به مشتری با شماره حساب 1 برابر است با 1.22

برای تست راه حلی که ایجاد کردین از کدهای زیر استفاده کنید:

CREATE TABLE [dbo].[Bank](
    [sh_hesab] [intNOT NULL,
    [sh_sanad] [intNOT NULL,
    [date_trs] [datetimeNOT NULL,
    [mablaq] [intNOT NULL,
 CONSTRAINT [PK_Bank] PRIMARY KEY CLUSTERED 
(
    [sh_hesab] ASC,
    [sh_sanad] ASC
)
)

insert into Bank(sh_hesab,sh_sanad,date_trs,mablaq)
select 
1,    0,    '1989-12-29',     30
union select
1,    1,    '1990-01-01',     75
union select
1,    2,    '1990-01-05',     50
union select
1,    3,    '1990-01-05',     -25
union select
1,    4,    '1990-01-10',     -10
union select
1,    5,    '1990-01-15',     -5
union select
1,    6,    '1990-01-25',     15
union select
1,    7,    '1990-01-25',     15
union select
1,    8,    '1990-01-25',     25