Select 求和直到设定数量,然后更新 mysql 数据库中的字段
Select sum until a set amount and then update fields in mysql database
item_id rate status
--------- ----------- ------
1 12 credit
2 10 credit
3 10 credit
4 20 cash
5 55 credit
我有上面的 table,一个用户输入了 25 的金额。现在我想将具有信用状态的行的状态从信用更新为现金,直到利率总和为 25,所以在上面 table 总和为 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
您可以使用 window 函数来识别需要更改的行:
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
item_id rate status
--------- ----------- ------
1 12 credit
2 10 credit
3 10 credit
4 20 cash
5 55 credit
我有上面的 table,一个用户输入了 25 的金额。现在我想将具有信用状态的行的状态从信用更新为现金,直到利率总和为 25,所以在上面 table 总和为 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
您可以使用 window 函数来识别需要更改的行:
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