簡體   English   中英

根據 MySQL 中相同計算列的先前值計算列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM