Py学习  »  DATABASE

基于预期库存的mysql返回数据

RahlSK • 4 年前 • 828 次点击  

我有一个水果桌,有两列日期和数量。它表明水果被添加到库存中的日期。

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

如果我想根据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.
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40021
 
828 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Kunal
Reply   •   1 楼
Kunal    5 年前

日期字段的数据类型是什么? 如果它是varchar,那么您必须使用mysql日期函数,然后执行查询,其他的解决方案是fifo原理可以用id来实现,如下所示

select * from fruit where quantity < 40 order by id asc
Madhur Bhaiya
Reply   •   2 楼
Madhur Bhaiya    5 年前
  • 我们首先使用 Session variables .
  • 然后,在 Derived table ,并找出总和超过40的“屏障”的日期。当新的滚动和大于或等于40时达到屏障。此时,我们将屏障值设置为1,前面的行设置为0,后面的行设置为2或更多。
  • date 是MySQL中的关键字。您应该避免使用它作为表名;否则请使用反勾号。

try(适用于所有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