2017-09-15 43 views
1

我有兩個表主鍵和外鍵(MaterialId)打開庫存,股市收盤日期相關的SQL查詢

  1. 材料表(多材料)
 
MaterialId MaterialName OpeningStock 
1   Pen   100 
2   Pencil   50 
  • 材料庫存(多重材料輸入)
  •  
    MaterialId PurchaseQty SalesQty Date 
    1   500   0   2016-12-15 
    1   0    0   2016-12-16 
    1   300   0   2016-12-17 
    1   0    400   2016-12-18 
    1   0    0   2016-12-19 
    1   0    0   2016-12-20 
    1   0    400   2016-12-21 
    1   200   100   2016-12-22 
    

    現在,當我通過@FromDate和@Todate 我要輸出象下面這樣:

     
    Date   MaterialName OpeningStock PurchaseQty SalesQty ClosingStock 
    2016-12-15 Pen   100   500   0   600 
    2016-12-16 Pen   600   0    0   600 
    2016-12-17 Pen   600   300   0   900 
    2016-12-18 Pen   900   0    400   500 
    2016-12-19 Pen   500   0    0   500 
    2016-12-20 Pen   500   0    0   500 
    2016-12-21 Pen   500   0    400   100 
    2016-12-22 Pen   100   200   100   200 
    
    

    注:
    1.如果事情是錯的數據庫表的話,請指導我如何處理這情況。 2.還可以從兩個表中查找當前日期庫存

    +0

    您是否嘗試過任何解決問題的方法? –

    +0

    @KETULSONI請向我們展示您的查詢在哪裏嘗試過? –

    +0

    1.遞歸CTE生成日期列表 2.累積和 –

    回答

    0

    您正在尋找各種數量值的滾動總和。這樣做的一種方法是使用相關子查詢:

    SELECT 
        t1.Date, 
        mt.MaterialName, 
        (SELECT OpeningStock FROM [Material Table] WHERE MaterialId = t1.MaterialId) + 
        COALESCE((SELECT SUM(t2.PurchaseQty - t2.SalesQty) FROM [Material Stock] t2 
        WHERE t2.Date < t1.Date AND t1.MaterialId = t2.MaterialId), 0) AS OpeningStock, 
        t1.PurchaseQty, 
        t1.SalesQty, 
        (SELECT OpeningStock FROM [Material Table] WHERE MaterialId = t1.MaterialId) + 
    COALESCE((SELECT SUM(t2.PurchaseQty - t2.SalesQty) FROM [Material Stock] t2 
        WHERE t2.Date <= t1.Date AND t1.MaterialId = t2.MaterialId), 0) AS ClosingStock 
    FROM [Material Stock] t1 
    INNER JOIN [Material Table] mt 
        ON t1.MaterialId = mt.MaterialId 
    ORDER BY 
        mt.MaterialName, 
        t1.Date; 
    

    注意,它是壞表的設計是從物料庫存表在一個單獨的表存儲期初存貨值。這意味着上述查詢將不會返回鉛筆記錄。更好的方法是將種子記錄插入到材料庫存中,對於每種材料,數量是初始庫存。

    輸出:

    enter image description here

    演示在這裏:

    Rextester

    +0

    謝謝,但「鉛筆」初始庫存是50數量。 –

    +0

    你從未提供任何鉛筆數據,因此沒有任何內容出現。您在上面看到的記錄基於材料庫存表。添加鉛筆的一些數據,你會得到輸出。 –

    +0

    好的,但如果某些日期數據不可用,那麼? 請檢查 - http://rextester.com/NDH6665 –

    0

    簡單地做如下:

    SELECT S.DATE, M.MaterialName, M.OpeningStock, S.PurchaseQty, S.SalesQty, SUM((M.OpeningStock+S.PurchaseQty)-S.SalesQty)ClosingStock FROM #TABLE 
    (
         SELECT * FROM MaterialTABLE 
    ) M 
    
    INNER JOIN Material S ON S.MaterialId = M.MaterialId where s.date between @FromDate and @Todate