复杂的查询

时间:2013-07-01 17:13:13

标签: mysql

我不确定是否可以使用纯粹的select语句完成以下操作,但我有两个表(截断了问题所需的数据)。

广告资源

  • id int (PRIMARY)
  • 数量 int

库存 - 包含库存商品库存的变化(库存历史记录)

  • id int (PRIMARY)
  • inventory_item_id int (FOREIGN KEY)
  • 数量 int
  • 创建了 datetime

库存中的数量是库存变化,而库存商品中的数量是该商品的当前数量

running列中的所有内容都将返回0

SELECT
inventory_item.id,
(inventory_item.quantity - SUM(stock.quantity)) AS running
FROM
    stock
        JOIN
    inventory_item ON stock.inventory_item_id = inventory_item.id
GROUP BY inventory_item.id

问题

现在,我想知道的是:是否可以使用SELECT选择stock_item的运行数量变为零的库存表中的所有日期?

我知道这可以通过简单地选择一个项目中的所有库存数据,并从当前库存项目数量中单独减去库存数量来编程,这将获得库存变化发生前的数量。我可以用SELECT吗?

5 个答案:

答案 0 :(得分:5)

(更新)假设对于给定的inventory_item_id组合永远不会有多条记录,请尝试:

SELECT i.id,
       s.created,
       i.quantity - COALESCE(SUM(s2.quantity),0) AS running
FROM inventory_item i
JOIN stock s ON s.inventory_item_id = i.id
LEFT JOIN stock s2 ON s2.inventory_item_id = i.id and s.created < s2.created
GROUP BY i.id, s.created
HAVING running=0

答案 1 :(得分:2)

最合乎逻辑的方法是使用累计和。但是,MySQL并不支持。

在我看来,最明确的方法是使用相关子查询来获取运行数量。然后,where子句的一个简单问题就是选择0

select i.*
from (select i.*,
             (select SUM(i2.inventory)
              from inventory i2
              where i2.inventory_item_id = i.inventory_item_id and
                    i2.created <= i.created
             ) as RunningQuantity
      from inventory i
     ) i
 where RunningQuantity = 0;

答案 2 :(得分:2)

我接受它:

select
    inventory_item_id `item`,
    created `when`
from
    (select 
         @total := CASE WHEN @curr <> inventory_item_id
                   THEN quantity
                   ELSE @total+quantity END as running_total,
         inventory_item_id,
         created,                   
         @curr := inventory_item_id
     from
         (select @total := 0) a
         (select @curr  := -1) b
         (select inventory_item_id, created, quantity from stock order by inventory_item_id, created asc) c
     ) running_total
where running_total.running_total = 0;

这个具有相对优势,只需要给库存表一次传递。取决于它的大小和索引,这可能是也可能不是一件好事。

答案 3 :(得分:2)

我认为这是一个简单的方法。

SELECT inventory_item.id, stock.created

FROM   inventory_item

       JOIN stock ON stock.inventory_item_id = inventory_item.id

WHERE  (SELECT SUM(quantity) FROM stock WHERE created <= stock.created) = 0

答案 4 :(得分:2)

根据要计算的found here...

运行总计,我得到了类似的回复

您可以使用MySQL @variables,但数据需要通过活动数据进行预先查询和排序...然后在每一行上设置一个导致否定的标志,并仅保留那些。像

这样的东西
select 
      PreQuery.*
   from 
      ( select
              s.id,
              s.created,
              @runBal := if( s.id = @lastID, @runBal - quantity, @i.quantity ) as CurBal,
              @lastID := s.id as IDToCompareNextEntry
           from
              stock s
                 join inventory_item ii
                    on s.inventory_item_id = ii.id,
              (select @lastID := -1,
                      @runBal := 0 ) sqlvars
           order by
              s.id,
              s.created DESC ) PreQuery
   where
      PreQuery.CurBal < 0

这样,对于每个库存项目,它按创建日期向后工作(按创建的每个ID降序排序)。因此,当库存ID更改时,请查看库存表“数量”字段以启动已用库存的计数。如果处理的是与上次记录相同的ID,只需使用运行余额并减去该库存条目的数量。

相关问题