选择总和直到设定数量,然后更新mysql数据库中的字段

Posted

技术标签:

【中文标题】选择总和直到设定数量,然后更新mysql数据库中的字段【英文标题】:Select sum until a set amount and then update fields in mysql database 【发布时间】:2021-03-16 01:11:25 【问题描述】:
 item_id      rate            status
 ---------    -----------     ------
   1           12              credit
   2           10              credit
   3           10              credit
   4           20              cash
   5           55              credit

我有上表,用户输入和金额为 25。现在我想将具有信用状态的行的状态从信用更新为现金,直到利率总和为 25,所以在上表中顶部总和为 22 的 1 行应获得现金状态。由于用户输入是 25,我仍然有 3 (25-22) 的余额,这个余额应该从第三行中扣除,使第三行利率为 7。我想要的结果是表格形式,突出显示了更改:

 item_id      rate            status
 ---------    -----------     ------
   1           12              **cash**
   2           10              **cash**
   3           **7**           credit
   4           20              cash
   5           55              credit

【问题讨论】:

【参考方案1】:

您可以使用窗口函数来识别需要更改的行:

select item_id, 
    case when sum_rate >= 25 then 'credit' else 'cash' end as status, 
    case when sum_rate >= 25 then sum_rate - 25 else rate end as rate
from (
    select t.*, sum(rate) over(order by item_id) sum_rate
    from mytable t
    where status = 'credit'
) t
where sum_rate - rate < 25

如果您愿意,可以将该逻辑放入 update 语句中:

update mytable t
inner join (
    select item_id, sum(rate) over(order by item_id) sum_rate
    from mytable t
    where status = 'credit'
) t1 on t1.item_id = t.item_id
set 
    t.status = case when sum_rate >=  25 then 'credit' else 'cash' end,
    t.rate =   case when t1.sum_rate >= 25 then t1.sum_rate - 25 else t.rate end
where t1.sum_rate - t.rate < 25

Demo on DB Fiddle

【讨论】:

你好,谢谢,但是当我尝试使用代码更新时,速率不正确,它改变了行速率的状态也改变了,这不应该是这种情况 @HamzaZahir:我只是对答案做了一个小的更新(但它不会改变费率)。这确实会产生您为示例数据显示的结果,所以我不知道您所说的不正确是什么意思。 当我尝试使用一个值作为用户输入时,它是正确的,但是当我尝试使用另一个值作为用户输入时,结果速率不正确。 @HamzaZahir:这太模糊了。请编辑小提琴以显示您认为无法正常工作的内容。 你现在可以检查一下小提琴吗?预期结果是 id 2 的状态应该更改为现金,id 3 的利率应该是 9(11-10,其中 11 是输入值,10 是 id 2 的利率),不一定要改变 id 3 的利率, id 1 费率也可以更改。

以上是关于选择总和直到设定数量,然后更新mysql数据库中的字段的主要内容,如果未能解决你的问题,请参考以下文章

怎样统计EXCEL中相同项目的总和

如何用数据库mysql查询产品的产品编号和销售数量的总和

根据其他列的值选择总和

选择总和列,然后从列中获取最小值

如何获取MySQL行,直到某列的总和超过阈值?

更新产品数量(php和Mysql)