首页 > 解决方案 > 运行减法,但仅在金额仍高于限制时才进行减法

问题描述

我有一个具有以下结构的表,我想将 TotalAmount 减去 Amount,但前提是剩余金额仍高于限制。排序是在移动到下一个数据之前应该首先尝试的顺序

Sort    Amount    Limit    TotalAmount
1       200       500      2000
3       500       500      2000
10      1000      500      2000
17      30        500      2000

预期结果

Sort    Amount    Limit    TotalAmount    RemainingAmount
1       200       500      2000           1800
3       500       500      2000           1300  
10      1000      500      2000           1300  --This is still 1300 because 1300 - 1000 is 300
17      30        500      2000           1270

我一直在尝试窗口函数,但我不知道如何应用在条件下保持相同数量的逻辑。

SELECT Sort, Amount, Limit, TotalAmount, TotalAmount - SUM(Amount) OVER (ORDER BY Sort) as RemainingAmount

我还尝试了一些案例并检查我是否低于限制

CASE WHEN TotalAmount - SUM(Amount) OVER (ORDER BY Sort) < Limit THEN --readd the amount again?

标签: mysqlsqlmysql-8.0

解决方案


声明一个运行变量@Amount以记住扣除的金额,并对所选的每一行进行计算。

SELECT Sort, Amount, `Limit`, TotalAmount, 
CASE WHEN TotalAmount - @Amount - Amount < `Limit` 
     THEN TotalAmount - @Amount ELSE TotalAmount - (@Amount := @Amount + Amount) 
     END AS RemainingAmount
FROM v 
JOIN ( SELECT @Amount := 0 ) f
ORDER BY Sort

推荐阅读