基于计划表的预计付款?

时间:2013-10-12 20:17:48

标签: sql sql-server sql-server-2012

我有一个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)之间所有日期的表。这只是一个参考表,我认为这对我将要做的事情很有用。

我现在要做的是创建一个程序,将一个从给定的开始日期到给定的结束日期的日期表返回,并且对于每个日期,根据我的日程返回在该日期应该完成的任何付款表

我的计划是创建一个临时表,其中包含付款到期日期:

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”或什么?

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

我假设您有#days表,其中包含日历中每天的日期,所以2013-01-01,2013-01-02等。

此外,我不知道您何时会按月计划和第一次付款日期向某人付款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)
            )
        )
    )

答案 1 :(得分: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中。如果不同则相应地更改代码。