从行中减去一个数字,直到数字结束为零

Posted

技术标签:

【中文标题】从行中减去一个数字,直到数字结束为零【英文标题】:Subtract a number from the rows until the number ends to zero 【发布时间】:2020-06-28 21:31:05 【问题描述】:

如何通过查询更新从行中减去一个数字到 mysql 中的减法末尾

如果有这样的表

Store Table
itemId  storeCode   qoh
1          1        20
1          2        30
1          3        40

我想从 qoh 中减去 "80" 得到输出

itemId  storeCode   qoh
1          1        0
1          2        0
1          3        10

我试过了,没用

set @sum = 80;
Update store SET qoh =
(SELECT IF((@sum := @sum - qoh) > 0,0,qoh))
ORDER BY storeCode ASC;

什么是适当的调整?

【问题讨论】:

【参考方案1】:

如果您运行的是 MySQL 8.0,则可以使用窗口函数进行计算。

以下select 查询为您提供预期结果:

select
    s.*,
    case when sum(qoh) over(partition by itemid order by storecode) - qoh >= 80 
        then qoh
        else greatest(
            sum(qoh) over(partition by itemid order by storecode) - 80,
            0
        )
    end new_qoh
from store s

然后您可以将其转为update

update store s
inner join (
    select 
        s.*, 
        sum(qoh) over(partition by itemid order by storecode) sum_qoh
    from store s
) n 
    on  n.itemid = s.itemid 
    and n.storecode = s.storecode
    and n.sum_qoh - s.qoh < 80
set s.qoh = greatest(n.sum_qoh - 80, 0)

Demo on DB Fiddle

项目 ID |商店代码 |呸 -----: | --------: | --: 1 | 1 | 0 1 | 2 | 0 1 | 3 | 10 1 | 4 | 50

我在您的数据末尾添加了一个额外的行,以证明查询使“以下”qon 保持不变。

【讨论】:

以上是关于从行中减去一个数字,直到数字结束为零的主要内容,如果未能解决你的问题,请参考以下文章

减去前一个数据帧的当前值

编辑数字直到达到总和值

T:SQL:从行中选择值作为列

根据同一行中的另一个值从行中选择某个值

读取文件并从行中删除 \n 和空格 [重复]

如果满足某些条件,则从行中获取信息