2017-03-13 34 views
1

我有兩個表在我的數據庫main_item_stock和stock_history如何在SELECT子句中使用子查詢?

我想創建一個報告表明,有多少股票,缺貨和浪費在main_item_stock每一個項目,每一個動作該用戶做會插入一條記錄進入stock_history。

main_item_stock 
----------------------------------------------- 
stkitm_id stkitm_code stkitm_name stkitm_qty 
----------------------------------------------- 
    1  S001   Apple  10.000 
    2  S002   Orange  5.000 
----------------------------------------------- 


stock_history 
------------------------------------------------------------------------------------- 
stkhis_id sktitm_id stkitm_code stkitm_name stkhis_type stkhis_qty created_date 
    1   1   S001   Apple  Wastage  1.000  2017/03/13 
    2   2   S002  Orange  Stock Out  0.500  2017/03/12 
    3   2   S002  Orange  Stock In  0.100  2017/03/13 
------------------------------------------------------------------------------------- 

結果,我想: -

---------------------------------------------------------------------------------------------- 
stkitm_code stkitm_name created_date item_onhand item_stockin item_stockout item_wastage 
---------------------------------------------------------------------------------------------- 
    S001  Apple  2017/03/13 9.000  0    0    1 
    S002  Orange  2017/03/12 4.500  0    0.500   0 
    S002  Orange  2017/03/13 4.600  0.100   0    0 

*item_onhand = main_item_stock.stkitm_qty 

我曾嘗試下面的查詢,但stockin,缺貨,浪費總是返回相同的值

query = "SELECT main_item_stock.stkitm_code,main_item_stock.stkitm_name,main_item_stock.stkitm_qty, 
        (SELECT SUM(stkhis_qty) FROM stock_history WHERE stkhis_type = 'Stock Out'" 

      If dtp_from.Checked Then 
       query &= " AND DATE(stock_history.created_date) >= '" & Format(CDate(dtp_from.Text), "yyyy-MM-dd") & "' 
          AND DATE(stock_history.created_date) <= '" & Format(CDate(dtp_to.Text), "yyyy-MM-dd") & "'" 
      End If 

      query &= ") AS 'item_stockout', 
        (SELECT SUM(stkhis_qty) FROM stock_history WHERE stkhis_type = 'Wastage'" 

      If dtp_from.Checked Then 
       query &= " AND DATE(stock_history.created_date) >= '" & Format(CDate(dtp_from.Text), "yyyy-MM-dd") & "' 
          AND DATE(stock_history.created_date) <= '" & Format(CDate(dtp_to.Text), "yyyy-MM-dd") & "'" 
      End If 

      query &= ") AS 'item_wastage', 
        (SELECT SUM(stkhis_qty) FROM stock_history WHERE stkhis_type = 'Stock In'" 

      If dtp_from.Checked Then 
       query &= " AND DATE(stock_history.created_date) >= '" & Format(CDate(dtp_from.Text), "yyyy-MM-dd") & "' 
          AND DATE(stock_history.created_date) <= '" & Format(CDate(dtp_to.Text), "yyyy-MM-dd") & "'" 
      End If 

      query &= ") AS 'item_stockin' 
        FROM main_item_stock 
        LEFT JOIN stock_history 
        ON main_item_stock.stkitm_id = stock_history.stkitm_id" 

      query &= " GROUP BY stock_history.stkitm_id" 

如何更改查詢,並得到我想要的結果?

UPDATE:

我曾嘗試另一個查詢,這次返回的數據是正確的,但我可以用這個表來創造我想要的報告?

SELECT SUM(stkhis_qty),stkitm_name,stkhis_type,DATE(created_date) 
FROM stock_history 
WHERE DATE(created_date) >= '2017/03/12' 
GROUP BY stkitm_code,stkhis_type,DATE(created_date) 

結果: -

enter image description here

enter image description here

我怎樣才能改變此搜索表鏡像2?該報告需要有所有這些列

UPDATE:

這是main_item_stock

main_item_stock

這是stock_history

stock_history

結果應該看起來像下面的圖片,無論是類型也可以。

enter image description here

*圖片上的最後一個記錄日期是錯誤的應該是2017年3月17日

+0

是的,爲什麼你不能?如果您在查詢數據後使用reportviewer,請將該數據放入數據表中,並將其與reportviewer控件一起使用。 – codeMonger123

+0

@ codeMonger123我知道我可以使用DataTable創建一個報表,但我不知道如何將StockOut,StockIn,Wastage更改爲第 – vbnewbie

+0

列是否希望報表按item_id或歷史ID排序?那麼'stkhis_id'或'sktitm_id'(首先是所有的蘋果,然後是所有的橘子,否則)?取決於此,可能有非常不同的方法。 – Solarflare

回答

1

這應該讓你很接近......

*編輯,以反映變化手頭物品而不是現有物品總數。

SELECT 
sh.stkitm_code, 
sh.stkitm_name, 
SUM(IF(stkhis_type = 'Stock In', 
    sh.stkhis_qty, 
    -1 * sh.stkhis_qty))    AS change_of_item_onhand, 
SUM(IF(stkhis_type = 'Stock In', 
    sh.stkhis_qty, 
    0))        AS item_stockin, 
SUM(IF(stkhis_type = 'Stock Out', 
    sh.stkhis_qty, 
    0))        AS item_stockout, 
SUM(IF(stkhis_type = 'Wastage', 
    sh.stkhis_qty, 
    0))        AS item_wastage, 
sh.created_date 
FROM stock_history sh 
LEFT JOIN main_item_stock mis ON mis.stkitm_code = sh.stkitm_code 
WHERE sh.created_date > "<Oldest date>" 
AND sh.created_date < "<Youngest date>" 
GROUP BY stkitm_code 

應該導致看起來像輸出其中:

enter image description here

雖然你可能要組由stkitm_code和日期。

或者,刪除「SUM」 S和「GROUP BY」將逐項它,但item_onhand列將不累計(有可能是,雖然這樣做一個漂亮的方式)

SELECT 
sh.stkitm_code, 
sh.stkitm_name, 
IF(stkhis_type = 'Wastage' OR 
    stkhis_type = 'Stock Out', 
    mis.stkitm_qty - sh.stkhis_qty, 
    mis.stkitm_qty + sh.stkhis_qty) AS item_onhand, 
IF(stkhis_type = 'Stock In', 
    sh.stkhis_qty, 
    0)        AS item_stockin, 
IF(stkhis_type = 'Stock Out', 
    sh.stkhis_qty, 
    0)        AS item_stockout, 
IF(stkhis_type = 'Wastage', 
    sh.stkhis_qty, 
    0)        AS item_wastage, 
sh.created_date 
FROM stock_history sh 
LEFT JOIN main_item_stock mis ON mis.stkitm_code = sh.stkitm_code 
WHERE sh.created_date > "<Oldest date>" 
AND sh.created_date < "<Youngest date>" 

哪最終會看起來像這樣:

enter image description here

希望這有助於!

+0

嗨,我已經試過你的查詢,第一次查詢stockin,缺貨,浪費是正確的,但item_onhand返回錯誤的價值,對於第二個查詢我不能運行在一起,很多錯誤出來無法識別的關鍵字,意外的標記。 – vbnewbie

+0

我編輯了我的答案以解決第一個問題,我不確定第二個問題 – Tim

+0

其實我不確定您是否可以通過這種方式獲得這樣的總和,我已經編輯了答案以便僅顯示更改手頭物品,而不是手頭的實際物品 – Tim