Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
期初库存、期末库存按日期sql查询_Sql_Sql Server - Fatal编程技术网

期初库存、期末库存按日期sql查询

期初库存、期末库存按日期sql查询,sql,sql-server,Sql,Sql Server,我有两个带有主键和外键的表(MaterialId) 物料表(多物料) 材料名称打开库存 1笔100 2铅笔50 物料库存(多物料录入) 实际采购数量销售数量日期 1 500 0 2016-12-15 1 0 0 2016-12-16 1 300 0 2016-12-17 1 0

我有两个带有主键和外键的表(MaterialId)

  • 物料表(多物料)
  • 材料名称打开库存 1笔100 2铅笔50
  • 物料库存(多物料录入)
  • 实际采购数量销售数量日期 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 日期物料名称打开库存采购数量销售数量关闭库存 2016年12月15日Pen 1005000600 2016-12-16 Pen 600 00 600 2016年12月17日Pen 600 300 900 2016-12-18 Pen 900 400 500 2016-12-19钢笔500 2016-12-20钢笔500 2016年12月21日Pen 500 400 100 2016-12-22钢笔100 注:
    1.如果数据库表出现问题,请指导我如何处理这种情况。
    2.还可以从两个表中查找当前日期库存

    您要查找的是各种数量值的滚动总和。一种方法是使用相关子查询:

    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;
    
    选择
    t1.日期,
    mt.MaterialName,
    (从[Material Table]中选择OpeningStock,其中MaterialId=t1.MaterialId)+
    合并((从[物料库存]t2中选择总和(t2.采购数量-t2.销售数量)
    其中t2.Date
    
    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
    

    到目前为止,您是否尝试过任何方法来解决问题?@KETULSONI请向我们展示您的查询,您在哪里尝试过某种方法?1.递归CTE以生成日期列表2.为什么您认为有问题?谢谢,但是“铅笔”呢期初库存为50个数量。您从未提供任何铅笔数据,因此没有显示任何内容。您在上面看到的记录基于材料库存表。添加一些铅笔数据,您将获得输出。好的,但是如果一些日期数据不可用,那么请检查-@KETULSONI您当前的设计不好,您不应该存储initial库存在单独的表格中。相反,只需在库存表格中插入一条记录,记录每种材料的初始库存。您明白吗?
    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;
    
    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