我不确定是否可以使用纯粹的select语句完成以下操作,但我有两个表(截断了问题所需的数据)。
广告资源
库存 - 包含库存商品库存的变化(库存历史记录)
库存中的数量是库存变化,而库存商品中的数量是该商品的当前数量
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吗?
答案 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,只需使用运行余额并减去该库存条目的数量。