mysql - 运行减法,但仅在金额仍高于限制时才进行减法
问题描述
我有一个具有以下结构的表,我想将 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?
解决方案
声明一个运行变量@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
推荐阅读
- android - 从片段更改主题
- amazon-web-services - 在 CDK 中查找或创建 s3 存储桶?
- html - HTML
- docker - Jenkins 无法通过 ssh-agent 执行 docker login
- wso2 - WSO API Manager 隐藏 BODY 请求的一些信息
- functional-programming - 如何在 spring webflux 功能端点处理程序中将 application/json 类型的 FilePart 编组到 POJO?
- c - 每次我都无法理解为什么会发生这种情况,第一个数字一直在重复
- ssh - 不会将我的 ssh 密钥放在 ~/.ssh/ 文件夹中以防止人们访问我的笔记本电脑吗?
- c# - Net Core 部署的应用程序在 IIS 上引发错误 404
- sql - 查询选择部门