mysql根据预期库存返回数据

时间:2018-10-24 10:55:34

标签: mysql

我有一个水果表,有2列日期和数量。它指示将水果添加到库存的日期。

产品按照先进先出的原则出售。

如果我想基于FIFO原理卖40个苹果,对于以下情况,我要编写什么sql查询?我希望记录1,2,3将被退回

+-id-+----date----+---quantity--+
 1   | 02/05/2015 |    10
 2   | 03/05/2015 |    20
 3   | 04/05/2015 |    30
 4   | 05/05/2015 |    30

select * from fruit where quantity less than < 40 order by date asc
//returns record 1 and 2 only.

2 个答案:

答案 0 :(得分:0)

日期字段的数据类型是什么? 如果是varchar,则必须使用mysql date函数,然后执行查询,其他解决方案是FIFO原理也可以使用id来实现

select * from fruit where quantity < 40 order by id asc

答案 1 :(得分:0)

  • 我们首先使用Session variables计算滚动总和。
  • 然后,在Derived table中使用结果集,并找到总和超过“障碍” 40的日期。当新的滚动总和大于或等于40时,达到障碍。此时将障碍值设置为1,将其前面的行设置为0,将其后的行设置为2或更大。
  • date是MySQL中的关键字。您应该避免使用它作为表名。否则在其周围使用反引号

尝试(适用于所有MySQL版本):

SELECT dt.id, 
       dt.`date`, 
       dt.quantity
FROM 
(
  SELECT 
    f.id, 
    f.`date`, 
    f.quantity, 
    @barrier := CASE
                  WHEN 
                       (@tot_qty := @tot_qty + f.quantity) >= 40
                  THEN (@barrier + 1)
                  ELSE 0
                END AS barrier 
  FROM 
    Fruit AS f 
  CROSS JOIN (SELECT @tot_qty := 0, 
                     @barrier := 0) AS user_init
  ORDER BY f.`date`
) AS dt 
WHERE dt.barrier <= 1

DB Fiddle DEMO