[英]Calculate column based on previous value of the same calculated column in MySQL
下面是示例數據:
月 | 已付款 | 需要付款 | 工資稅 |
---|---|---|---|
1 | 0 | 0 | 0 |
2 | 200 | 190 | 190 |
3 | 500 | 190 | 190 |
4 | 0 | 190 | 190 |
5 | 0 | 190 | 380 |
6 | 200 | 190 | 570 |
7 | 200 | 190 | 560 |
在這里,到期付款計算為 -
if
('payment made' previous month < 'Payment due' previous month)
then
'payment due' previous month + 'Payment required' current month - 'Payment made' previous month
else
'Payment required' current month
END if
我知道我可以使用“滯后”來獲取上個月的付款價值,但我如何為計算列 - 付款到期做這件事?
假設月份從 1 開始,帶有遞歸的 CTE 可能會起作用
with recursive cte
as (
select month, payment_made, payment_required, 0 payment_due
from data
where month = 1
union
select b.month, b.payment_made, b.payment_required, (
case when a.payment_made < a.payment_due
then a.payment_due + b.payment_required - a.payment_made
else b.payment_required
end
)
from cte a
join data b on a.month + 1 = b.month
)
select * from cte
或在 row_number 上遞歸
with recursive
seq as (
select *, row_number() over(order by month) rn
from data
),
cte as (
select seq.rn, seq.month, seq.payment_made, seq.payment_required, seq.payment_required payment_due
from seq
where seq.rn = 1
union
select b.rn, b.month, b.payment_made, b.payment_required, (
case when a.payment_made < a.payment_due
then a.payment_due + b.payment_required - a.payment_made
else b.payment_required
end
)
from cte a
join seq b on a.rn + 1 = b.rn
)
select * from cte
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=40b4da5924ea279d6c3d3c1a0e0cb1cd
這會起作用,因為您的示例上的月份從 1 1 開始並增加 1,如果數據不是那么平滑,您必須更改更新中的子查詢以更好地適應
CREATE TABLE payments ( `Month` INTEGER, `Payment Made` INTEGER, `Payment Required` INTEGER, `payment Due` INTEGER ); INSERT INTO payments (`Month`, `Payment Made`, `Payment Required`, `payment Due`) VALUES ('1', '0', '0', '0'), ('2', '200', '190', '190'), ('3', '500', '190', '190'), ('4', '0', '190', '190'), ('5', '0', '190', '380'), ('6', '200', '190', '570'), ('7', '200', '190', '560');
UPDATE payments as pay1 , (SELECT p2.`Month`, if (p1.`Payment Made` < p1.`payment Due`, p1.`payment Due` + p2.`Payment Made` - p1.`Payment Made` , p2.`Payment Required` ) payment_due FROM payments p1 INNER JOIN payments p2 ON p2.`Month` = p1.`Month` + 1) pay2 SET pay1.`payment Due` = pay2.payment_due WHERE pay1.`Month` = pay2.`Month`
SELECT * FROM payments
\n月 | 已付款 | 需要付款 | 工資稅\n ----: | -----------: | ---------------: | ----------:\n 1 | 0 | 0 | 0\n 2 | 200 | 190 | 190\n 3 | 500 | 190 | 190\n 4 | 0 | 190 | 190\n 5 | 0 | 190 | 190\n 6 | 200 | 190 | 580\n 7 | 200 | 190 | 570\n
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.