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
我有一个 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