2013-10-12 42 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中。如果不同,请相应地更改代码。