以条件运行总计并始终查看先前的值

时间:2019-05-14 19:29:11

标签: mysql sql

我想通过考虑一些额外条件在表格中进行顺序求和。 我们需要确保当顺序求和时,如果一个id为+40,则下一个和为130,如果下一个为+1,则和仍为130,现在如果下一个为-1,则总和必须为129。 第一次需要将100加到总和上,然后根据条件只增加计数。 我们甚至需要限制总和的最小值,使其不小于70

我已经尝试过下面的查询,但是它似乎没有考虑先前的值。

我尝试过的示例:

create table tableA (id int not null, count int not null);  
insert into tableA(id, count) values(1,11), (2,21),(3, -3); -- case 1  
insert into tableA(id, count) values(1,35), (2,-3); -- case 2
insert into tableA(id, count) values(1,-45),(2,67); -- case3

尝试查询:

 select t.id, t.count,
 case when (100+(select ifnull(sum(count),0) from tableA x where x.id <= t.id)) >= 130 then 130
      when (100+(select ifnull(sum(count),0) from tableA x where x.id <= t.id)) <= 70 then 70
      else (100+(select ifnull(sum(count),0) from tableA x where x.id <= t.id))     
 end  as xxxx
 from tableA t;

我希望我的输出看起来像:

案例1结果:

id  count   Sum
1   11      111
2   21      130
3   -4      126

案例2结果:

id  count   Sum
1   35      130
2   -3      127

Case3结果:

id  count   Sum
1   -45     70
2   67      137

1 个答案:

答案 0 :(得分:1)

这回答了问题的原始版本。

我认为这可以满足您的要求

select a.*, (@sum := least(@sum + count, 130)) as "sum"
from (select a.*
      from tablea a
      order by a.id
     ) a cross join
     (select @sum := 0) params;

我不知道100的来源。这不是您的解释的一部分。

Here是db <>小提琴,它说明了以30为极限(这似乎是您的意图)如何工作的。