【问题标题】:Projected Payments based on Schedule table?基于进度表的预计付款?
【发布时间】:2013-10-12 20:17:48
【问题描述】:

我有一个 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

)

填好后,我就可以使用日历表并创建余额预测。

但是,将数据放入该表是很棘手的。

我想我需要查看每个 schedule_transaction,然后查看日历,看看是否会在该日期完成交易?然后将该行插入到我的临时表中?

那么,我认为它会是嵌套游标。对于每个 schedule_transaction 行,然后对于每个日历行,并使用某种形式的“DATEADD”或其他什么?

谁能帮我解决这个问题?

【问题讨论】:

  • 我有点明白你的意思,但我认为一个简单的例子配合你对问题的描述会让事情更清楚。
  • 有完整源代码的最终解决方案吗?

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


【解决方案1】:

我假设您有 #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)
            )
        )
    )

【讨论】:

    【解决方案2】:

    这可以使用常见的表格表达式来完成。执行以下代码以列出在给定日期范围内到期的所有付款。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2015-05-12
      • 2020-03-02
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多