2010-01-07 74 views
0

我有兩個表:一個持有產品和一個持有相關庫存移動。獲取任何給定日期的庫存產品清單

產品表:

Seq | Name | Barcode 

移動表:

Seq | ProductFK | Direction | Date 

每個產品可以有多個IN和/或移出記錄。
如何獲得任何特定日期的所有庫存產品清單?

我嘗試以下,但如果有一個以上的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。

+0

是否每個移動記錄顯示1個單位產品的運動,或是否缺少數量字段? – Don 2010-01-07 17:22:41

回答

0

我可能誤解了你的問題。

每當您有「IN」時,只需將庫存數加1。每當有「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。

0

您可以使用庫存,交易和時間作爲維度創建OLAP多維數據集。我是一名MSSQL人員,所以我會在Reporting Server中完成所有工作,但我確定那裏也有MySQL立方體分析器。

快速谷歌搜索建議:www.ramsetcube.com

1

有與direction列是文本/ VARCHAR一個根本的問題,只有「在」和/或「出」的價值觀包含。沒有辦法知道所涉及的數字,這意味着無法知道某一天的股票是否存在。如果數據類型是數字,則可以對給定日期的列進行求和(假設傳出庫存爲負數)。

假設方向塔中使用的數值數據類型,使用方法:

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列上的索引無法使用 - 假定存在一個索引。

+0

因此,如果方向欄是一個數字(對於in,我認爲是1,對於out我認爲是-1),那麼如何在任何給定的日期獲得prodruct的庫存清單? – Flo 2010-01-07 17:00:17

+0

我有日期時間分爲2列:日期和時間列(時間只是爲掃描產品時的用戶信息) 因此,不需要使用我假設的日期函數。 我只知道基本的SQL,但我想我看到你的意思後,我想一些試驗。 我真的很感謝你的幫助 – Flo 2010-01-07 17:38:36

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 
相關問題