【问题标题】:Opening Stock, Closing Stock By Date sql Query开仓、平仓按日期sql查询
【发布时间】:2018-02-24 05:36:06
【问题描述】:

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

  1. 材料表(多种材料)
MaterialId 材质名称 OpeningStock 1 笔 100 2 铅笔 50
  1. 物料库存(多个物料输入)
MaterialId 采购数量 销售数量 日期 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 我想输出如下:

日期 材料名称 OpeningStock PurchaseQty SalesQty ClosingStock 2016-12-15 笔 100 500 0 600 2016-12-16 笔 600 0 0 600 2016-12-17 笔 600 300 0 900 2016-12-18 笔 900 0 400 500 2016-12-19 笔 500 0 0 500 2016-12-20 笔 500 0 0 500 2016-12-21 笔 500 0 400 100 2016-12-22 笔 100 200 100 200

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

【问题讨论】:

  • 到目前为止,您是否尝试过任何方法来解决问题?
  • @KETULSONI 请告诉我们您在哪里尝试过的问题?
  • 1.递归 CTE 生成日期列表 2. 累积和
  • 你为什么认为有问题?

标签: sql sql-server


【解决方案1】:

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

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;

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

输出:

演示在这里:

Rextester

【讨论】:

  • 谢谢,但是“铅笔”的期初库存是 50 件呢。
  • 您从未提供过任何铅笔数据,因此什么也没有出现。您在上面看到的记录是基于物料库存表的。为铅笔添加一些数据,您将获得输出。
  • 好的,但是如果某些日期数据不可用呢?请检查-rextester.com/NDH6665
  • @KETULSONI 您当前的设计很糟糕,您应该不将初始库存存储在单独的表中。相反,只需在库存表中为每种材料插入一条记录,以使用初始库存作为种子。你明白吗?
【解决方案2】:

只需执行以下操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2016-09-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2016-06-30
    • 2017-09-15
    • 2019-08-02
    相关资源
    最近更新 更多