正在根据付款计划计算 "first overdue" 日期

Calculating "first overdue" date from a payment schedule

总结

我正在根据 table 收到的发票和付款编写 "Aged debtors" 视图,在到期付款和收到付款之间没有 link。我如何使用 SQL 来计算未结金额和最早未结算的发票金额?

例子

发票

+------------+-----------+------------+
| CustomerID | AmountDue |  DateDue   |
+------------+-----------+------------+
|          1 |       100 | 2015-02-01 |
|          1 |       100 | 2015-03-01 |
|          1 |       100 | 2015-04-01 |
+------------+-----------+------------+

已收到付款

+------------+----------------+--------------+
| CustomerID | AmountReceived | DateReceived |
+------------+----------------+--------------+
|          1 |             60 | 2015-01-11   |
|          1 |            100 | 2015-02-21   |
+------------+----------------+--------------+

期望的输出(当 运行 2015-04-01 之后的某个时间)

+------------+-------------------+-----------------------+
| CustomerID | AmountOutstanding | FirstUnsettledInvoice |
+------------+-------------------+-----------------------+
|          1 |               140 | 2015-03-01            |
+------------+-------------------+-----------------------+

当前输出

+------------+-------------------+-----------------------+
| CustomerID | AmountOutstanding | FirstUnsettledInvoice |
+------------+-------------------+-----------------------+
|          1 |               140 | 2015-04-01            |
+------------+-------------------+-----------------------+

当前查询

  SELECT TotalPayment.CustomerID, TotalDue - TotalReceived as AmountOutstanding, MaxDueDate as FirstUnsettledInvoice
  FROM 
    (SELECT CustomerID, SUM(AmountReceived) as TotalReceived
    FROM PaymentReceived
    GROUP BY CustomerID) as TotalPayment
  JOIN
    (SELECT CustomerID, SUM(AmountDue) as TotalDue, MAX(DateDue) as MaxDueDate
    FROM Invoice
    WHERE DateDue < GETUTCDATE()
    GROUP BY CustomerID) as TotalInvoice
  ON TotalPayment.CustomerID = TotalInvoice.CustomerID

感谢 Tab Alleman 的评论,我编写了以下查询,得到了我想要的结果:

 SELECT CustomerID, MAX(runningtotal) - MAX(TotalReceived), MIN(DateDue) FROM (
      SELECT 
        TotalPayment.CustomerID,
        TotalReceived,
        AmountDue,
        sum(AmountDue) over(order by DateDue rows unbounded preceding) as runningtotal,
        DateDue
      FROM
        Invoice
      JOIN
        (SELECT CustomerID, SUM(AmountReceived) as TotalReceived
        FROM PaymentReceived
        GROUP BY CustomerID) as TotalPayment
      ON TotalPayment.CustomerID = Invoice.CustomerID
) AS subquery
 WHERE subquery.AmountDue < subquery.runningtotal
 Group By CustomerID