1

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

初始数据

我需要每 3 天获得一份帐龄报告,因此脚本应采用最后一次付款或信用并将其应用于最后一次收费。所以结果会是这样的:

在此处输入图像描述

此处 245 美元的信用额度适用于最后 400 美元的费用,因此该费用的剩余余额为 155 美元。然后,脚本应该接受下一笔最后一笔付款,并按照如下相同的规则应用它:

在此处输入图像描述

此处 1300 美元的付款用于 4 月 2 日剩余的 155 美元余额,然后剩余的 1,145 美元用于 7 月 1 日的 1,300 美元费用,因此期末余额为 155 美元,结果如下:

在此处输入图像描述

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

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

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

4

1 回答 1

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>
于 2012-07-21T17:54:41.800 回答