2017-09-15 24 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