SQL老化报告

时间:2012-07-21 14:07:10

标签: sql

我有应收帐款的以下数据交易:

initial data

我需要每3天收到一次老化报告,因此脚本应该收取最后一笔付款或信用额度并将其应用到最后一次收费。所以结果会是这样的:

enter image description here

这里的最后400美元的费用是245美元,所以这笔费用的剩余余额为155美元。然后,脚本应该采取下一个最后一次付款并按照相同的规则应用它:

enter image description here

这里的$ 1300付款适用于4月2日的155美元余额,然后剩余的1,145美元将应用于7月1日的1300日费用,因此结束余额为155美元,因此:

enter image description here

所以,现在我知道最终余额是673.21美元,但我也知道在0-16天之间我有未结余额518.21和17-30天之间我有未结余额155。

有关如何进行SQL查询以获得此结果的任何线索?

非常感谢!!并感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在不同的数据库中有不同的方法可以做到这一点。我在Firebird 2.5中创建了一个包含您的值的表(仅添加了一个ID列,并且由于保留字而更改了名称)并运行了此语句:

with recursive tmp_payment (paid) as
(select -sum(amount)
 from account_receivables
 where amount < 0),
MyResultSet(id, MyBalance, RemainingCredit, Days) as
(select r.id, case when r.amount > p.paid then r.amount-p.paid end, 
        case when r.amount < 0 then p.paid
             when r.amount < p.paid then p.paid-r.amount 
             else 0 end, current_date - MyDate
 from account_receivables r
 cross join tmp_payment p
 where not exists(select 1 from account_receivables r2 where r2.id < r.id)
 union all
 select r3.id, case when r3.amount > rs.RemainingCredit then r3.amount - rs.RemainingCredit end,
        case when r3.amount < 0 then rs.RemainingCredit 
             when r3.amount < rs.RemainingCredit then rs.RemainingCredit - r3.amount 
        else 0 end,
        current_date - MyDate
 from ACCOUNT_RECEIVABLES r3
 join MyResultSet rs on r3.id = rs.id+1)

Select id, MyBalance, Days
from MyResultSet
union all
select null, (select sum(MyBalance) from MyResultSet), null
from rdb$database

除了rdb $ database,它只是一个表,只包含Firebird和InterBase中的一条记录,可能还有CURRENT_DATE(显而易见的含义),这应该是非常标准的SQL,尽管远非所有数据库支持WITH RECURSIVE (MyResultSet需要,tmp_Payment不是递归的)有些可能有不同的方法从另一个中减去一个日期。

这是声明的回复:

  ID   MYBALANCE DAYS
   1     <NULL>   110
   2     <NULL>    21
   3     155.00    20
   4     518.21    16
   5     <NULL>    16
<NULL>   673.21 <NULL>