2013-10-12 73 views
1

我有一個payment_schedule表:基於計劃表的預計付款?

CREATE TABLE [dbo].[scheduled_transaction](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [description] [varchar](20) NOT NULL, 
    [account_id] [int] NOT NULL, 
    [account_transaction_type_id] [int] NOT NULL, 
    [third_party_id] [int] NOT NULL, 
    [first_payment_date] [date] NOT NULL, 
    [last_payment_date] [date] NULL, 
    [payment_frequency] [int] NOT NULL, 
    [payment_frequency_type_id] [int] NOT NULL, 
    [payment_amount] [decimal](18, 2) NOT NULL, 
    [notes] [varchar](100) NULL, 
    [deleted] [datetime] NULL, 
    [createuser] [int] NOT NULL, 
    [createdate] [datetime] NOT NULL, 
    [lastupdateuser] [int] NULL, 
    [lastupdatedate] [datetime] NULL) ON [PRIMARY] 
) 

該表保存計劃的繳費爲我的家庭系統。頻率只是每日,每週或每月。因此,支付頻率= 1,支付頻率類型= 3(每月)表示每一個月支付一次。

我也有一個日曆表,這是一個大型時期(2000年至2040年)之間的所有日期表。這只是一個參考表,我認爲這對我將要做的事很有用。

我現在想要做的是創建一個過程,該過程將從給定的startdate返回給定的enddate的日期表,並且對於每個日期,返回應該在該日期完成的任何付款,基於我日程安排表。

我的計劃是創建一個臨時表的所有日期在那裏款項將因:

DECLARE @StartDate DATE 
DECLARE @EndDate DATE 

Set @StartDate = '01-JAN-2013' 
SET @EndDate = '31-DEC-2013' 

DECLARE @Schedule TABLE 
(
    ID INT NOT NULL IDENTITY(1,1), 
    TransactionDate DATE NOT NULL, 
    scheduled_transaction_id INT NOT NULL 

) 

一旦這樣填充,然後我就可以使用日曆表,並創建一個平衡的預測。

但是,將數據導入該表格非常棘手。

我想我需要通過每個scheduled_transaction,然後,通過日曆運行,看看是否會在該日期完成交易?然後將該行插入我的臨時表中?

那麼,我認爲這將是嵌套遊標。對於每個scheduled_transaction行,然後爲每個日曆行,並使用某種形式的'DATEADD'或什麼?

任何人都可以幫助我嗎?

+1

我有點得到你的意見,但我認爲一個簡單的例子去與你的問題描述會讓事情更清楚。 – jcwrequests

+0

完整源代碼的最終解決方案? – Kiquenet

回答

0

我假設你有#days表每天在日曆,以便2013-01-01,2013年1月2日等日期

此外,我不知道你什麼時候支付有月計劃和首付日期的人2013-01-31 ...?所以我會忽略這樣的情況:

select d.d as [day], st.id as transactionId 
from #days d 
inner join [scheduled_transaction] st 
on (d.d >= st.first_payment_date 
    and d.d <= st.last_payment_date 
    and (
      (
      st.payment_frequency = 2 
      and datediff(day, d.d, st.first_payment_date) % 7 = 0 
      ) 
      or 
      (
      st.payment_frequency = 1 
      ) 
      or 
      (st.payment_frequency = 3 
      and day(st.first_payment_date) = day(d.d) 
      ) 
     ) 
    ) 
0

這可以使用公共表格表達式來完成。執行以下代碼以列出給定日期範圍內到期的所有付款。

DECLARE @StartDate DATE 
DECLARE @EndDate DATE 

Set @StartDate = '01-JAN-2013' 
SET @EndDate = '31-DEC-2013' 

;with schedule as 
    (
     SELECT first_payment_date as Next_payment_date,* FROM scheduled_transaction 
     UNION ALL 
     SELECT DATEADD(dd,case when payment_frequency_type_id =1 then 1 -- Daily 
          else case when payment_frequency_type_id =2 then 7 --Weekly 
          else 30 end end --Monthly 
         ,Next_payment_date) , 
       id, description, account_id, account_transaction_type_id, third_party_id, first_payment_date, last_payment_date, payment_frequency, payment_frequency_type_id, 
       payment_amount, notes, deleted, createuser, createdate, lastupdateuser, lastupdatedate 
     FROM  schedule 
     WHERE Next_payment_date < last_payment_date 
    ) 
    SELECT * FROM SCHEDULE 
WHERE Next_payment_date between @StarDate and @EndDate 

此代碼假設支付頻率存儲在payment_frequency_type_id中。如果不同,請相應地更改代碼。