1

Account Receivables の次のデータ トランザクションがあります。

初期データ

エイジング レポートを 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

すべてのデータベースが 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 に答える