正在根据付款计划计算 "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
总结
我正在根据 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