SQL - 按升序从行中减去付款金额?

SQL - Minus Payment amount from rows in ascending order?

我有一个 PaymentSchedule table,如下所示,其中包含有关合同的信息,以及我们预计何时收到付款。

contractkey payment total DueDate
385884 Upfront 95.356 2022-05-17 00:00:00.000
385884 First 1 2022-06-09 00:00:00.000
385884 Final 143.034 2024-07-17 00:00:00.000

然后我有另一个 table,其中包含在 ContractKey 级别收到的付款,结构如下所示..

PaymentKey ContractKey Total
1 385884 47.68

这些 table 是使用 ContractKey 连接的。我想要做的是在我的 PaymentSchedule table 中添加一列,显示已在付款 table 中支付的每笔预定付款的金额。因此,在下面的示例中,我们可以看到已收到 ContractKey 385884 的 47.68,然后应在我的计算列中显示以下内容..

我写了下面的 SQL 但它没有给我后续行的正确输出..

with debitdetails as(
select contractkey,sum(total)[totalpaid]  from fact.Payments

group by contractkey
)
select s.contractkey, s.Payment, s.total, [DueDate],
sum(s.total) over (partition by s.contractkey order by [DueDate] asc) - totalpaid [TotalRemaining]
from [ref].[PaymentSchedule] s
left join debitdetails dd on s.contractkey=dd.ContractKey
where s.contractkey = 385884
order by s.contractkey

这给了我下面的..这不是我想要的,因为我希望它显示应付金额,减去已支付金额后剩余的金额。所以第二行应显示为 1,第三行应显示为 143.03

contractkey Payment total DueDate TotalRemaining
385884 Upfront 95.356 2022-05-17 00:00:00.000 47.676
385884 First 1 2022-06-09 00:00:00.000 47.676
385884 Final 143.034 2024-07-17 00:00:00.000 190.71

谁能帮我找出我哪里出错了?我想我只是错过了一些非常简单的东西..

用case表达式检查totalpaid与累计总和并据此计算剩余金额

第一个条件是totalpaid大于累计总和,所以remaining = 0

第二种情况是totalpaid只能覆盖部分累计金额

最终条件(else)是totalpaid完全不够支付金额,所以Remaining = 0

TotalRemaining = case when isnull(dd.totalpaid, 0) 
                      >=   sum(s.Total) over (partition by s.contractkey
                                                  order by s.DueDate)
                      then 0
                      when isnull(dd.totalpaid, 0)
                      >=   sum(s.Total) over (partition by s.contractkey
                                                  order by s.DueDate)
                           - s.Total
                      then sum(s.Total) over (partition by s.contractkey
                                                  order by s.DueDate)
                      -    isnull(dd.totalpaid, 0)
                      else s.Total
                      end