获取任何给定日期的库存产品清单

时间:2010-01-07 16:42:34

标签: sql mysql

我有两个表:一个持有产品,一个持有相关库存移动。

产品表:

Seq | Name | Barcode  

移动表格:

Seq | ProductFK | Direction | Date  

每个产品可以有多个IN和/或OUT移动记录 如何在任何给定日期获得所有库存产品的清单?

我尝试了以下操作但如果有多个IN和OUT移动则不起作用:

SELECT DISTINCT Product.* , Move.* FROM Product LEFT JOIN Move ON Product.Seq=Move.StockFK where not exists ( select * from Move where Product.Seq=Move.StockFK and Direction = "OUT") 

请有人帮我这个。我正在使用MySQL 5.1。

4 个答案:

答案 0 :(得分:1)

direction列是text / varchar的基本问题,只包含“in”和/或“out”值。没有办法知道所涉及的数字,这意味着无法知道某一天是否存在股票。如果数据类型是数字,则可以将给定日期的列相加(假设出库存为负数)。

假设direction列使用数字数据类型,请使用:

SELECT p.seq,
       p.name,
       p.barcode,
       x.stock_onhand
  FROM PRODUCTS p
  JOIN (SELECT m.productfk,
               SUM(m.direction) 'stock_onhand'
          FROM MOVE m 
         WHERE DAY(m.date) = ?
           AND MONTH(m.date) = ?
           AND YEAR(m.date) = ?
      GROUP BY m.productfk, 
               DAY(m.date),
               MONTH(m.date),
               YEAR(m.date)) x ON x.productfk = p.seq

因为DATETIME& TIMESTAMP数据类型包括时间部分,您必须使用函数来隔离日期。由于在列上使用了一个函数,因此无法使用date列上的索引 - 假设存在一个索引。

答案 1 :(得分:0)

您可以创建一个OLAP多维数据集,其中包含库存,事务和时间作为维度。我是MSSQL的人,所以我会在Reporting Server中完成所有这些工作,但我确信还有MySQL立方体分析器。

快速Google搜索建议:www.ramsetcube.com

答案 2 :(得分:0)

我可能误解了你的问题。

每当你有“IN”时,只需将库存数加一。每次有“OUT”时,只需减去一个。不同的是股票?

SELECT ProductFK, SUM(IF(m.direction='IN'))-SUM(IF(m.direction='OUT')) AS stock
FROM Move m WHERE m.Date < '20090101' AND stock > 0

应该这样做,如果你愿意的话,现在就把它加到你的产品表中。

如果您有省略的数量字段,则只需修改SUM IF。

答案 3 :(得分:0)

谢谢OMG小马和eckesicle:我发现你的答案组合为我提供了一个有效的解决方案:

SELECT p.Seq,
       p.Barcode,
       x.stock_onhand
   FROM Product p
   JOIN (SELECT ProductFK, SUM(IF(m.Direction='IN',1,0))-SUM(IF(m.Direction='OUT',1,0))  'stock_onhand'
      FROM Move m WHERE m.Date < "2010/01/19" GROUP BY ProductFK )
   x ON x.ProductFK = p.Seq where stock_onhand>0
相关问题