我有一個如下的表格(sql server 2019):
Name Total Payment BalanceForward Date
A NULL NULL 0 NULL[/span
A 20 40 NULL 01 -2021
A 100 50 NULL 02 -2021
A 50 80 NULL 03 2021
B NULL NULL 30 NULL
B 50 50 NULL 012021 NULL
B 50 80 NULL 02 -2021
B 50 40 NULL 03 2021
C NULL NULL 100 NULL
........
我想要的是更新 "BalanceForward "列,因為它將有前一行的余額 (當前行的總額-當前行的付款)
預期輸出:
Name Total Payment BalanceForward Date。
A NULL NULL 0 NULL[/span
A 20 40 20 01 2021
A 100 50 30 02 -2021
A 50 80 0 03 2021
B NULL NULL 30 NULL
B 50 50 30 01 2021
B 50 80 0 02 2021
B 50 40 10 03 2021
C NULL NULL 100 NULL
.......
什么是提供它的最佳方式?如果有任何幫助,我們將不勝感激。
uj5u.com熱心網友回復:
這看起來像是你想實作一個運行的總數。你可以通過使用sum over()視窗函式和updatable CTE來做到這一點:
with bf as (
select *,
Sum(total-payment) over(partition by name order by date)
sum(balanceforward) over(partition by name order by date) newbf
from t
)
update bf set balanceforward=newbf
where balanceforward is null
示例 DB<>Fiddle
uj5u.com熱心網友回復:這是Stu的答案的一個更強大的版本。你可以運行它兩次,任何次數都有相同的輸出。
with bf as (
select *, sum(total-payment) over(partition by name order by date) first_value(balanceforward) over(partition by name order by date) newbf
from t
)
update bf set balanceforward=newbf
where date is not null;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323125.html
標籤:
上一篇:改變資料表輸出的SQL問題
