期初库存,按日期关闭库存sql查询

sql sql-server

2270 观看

2回复

23 作者的声誉

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

  1. 物料表(多种物料)
MaterialId MaterialName OpeningStock
1笔100
2支铅笔50
  1. 物料库存(多个物料输入)
物料编号购买数量销售数量日期
1500 0 2016-12-15
1 0 0 2016-12-16
1300 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
1200100 2016-12-22

现在,当我通过@FromDate和@Todate时,我想输出如下:

日期物料名称期初库存购买数量销售数量期末库存
2016-12-15笔100500 0600
2016-12-16笔600 0 0 600
2016-12-17笔600300 0900
2016-12-18笔900 0400500
2016-12-19笔500 0 0 500
2016-12-20笔500 0 0 500
2016-12-21笔500 0400100
2016-12-22笔100200100200

注意:
1.如果数据库表出现问题,请指导我如何处理这种情况。2.并从两个表中查找当前日期库存

作者: KETUL SONI 的来源 发布者: 2017 年 9 月 15 日

回应 2


1

276593 作者的声誉

决定

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

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;

注意,将期初库存值存储在与物料库存表不同的表中是不好的表设计。这意味着以上查询将不返回铅笔记录。更好的方法是将每种材料的种子记录插入物料库存,数量作为初始库存。

输出:

在此处输入图片说明

演示在这里:

右旋酯

作者: Tim Biegeleisen 发布者: 2017 年 9 月 15 日

0

37024 作者的声誉

只需执行以下操作:

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
作者: Yogesh Sharma 发布者: 2017 年 9 月 15 日
32x32