Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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
计算缺货的T-SQL查询_Sql_Sql Server_Tsql - Fatal编程技术网

计算缺货的T-SQL查询

计算缺货的T-SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,最终目标是计算新产品的调整日产量 首先,我需要知道什么时候一件商品缺货了,这才是最要命的 TransaDate ItemCode TransQty OnHandBefore OnHandAfter 1/1/2016 xyz-125 -5 20 15 1/4/2016 xyz-126 -4 15 11 1/7/2016 xyz-1

最终目标是计算新产品的调整日产量

首先,我需要知道什么时候一件商品缺货了,这才是最要命的

TransaDate  ItemCode    TransQty    OnHandBefore    OnHandAfter
1/1/2016    xyz-125       -5              20               15
1/4/2016    xyz-126       -4              15               11
1/7/2016    xyz-127       -2              11                9
1/8/2016    xyz-128       -6               9                3
1/8/2016    xyz-129       -3               3                0
1/13/2016   xyz-130       20               0               20
1/13/2016   xyz-131       -4              20               16
1/13/2016   xyz-132      -10              16                6
1/18/2016   xyz-133       -6               6                0
1/23/2016   xyz-134        5               0                5
1/26/2016   xyz-135       -5               5                0
1/28/2016   xyz-136       20               0               20
1/28/2016   xyz-137       -4              20               16
任何时候只要是零,我想考虑一下当天缺货的项目。理想情况下,我会忽略之前或之后为0的天数,因为这两天都是部分销售。但对我来说,最重要也是最困难的部分是一件商品脱销后的几天。没有条目,因此我无法直接连接。因此,在上面的例子中,该商品在26日和27日缺货,即使27日没有上市。总的来说,本例显示1月8日、9日、10日、11日、12日、13日缺货,然后我们收到20份库存,然后1月18日、19日、20日、21日、22日、23日、26日、27日、28日也缺货

售出总数:49 平均每日交通量:49/31=1.58 缺货天数:15天 调整后的日销量:49/31-15=3.06

由于在没有销售的日子里没有记录,我想我需要创建一个派生表或类似的东西,其中包含该范围内的所有日期。为了使它更复杂的日期范围将是动态的每个项目,我需要知道有多少是在前30天售出的项目在我们的网站上线。因此,每个项目的开始日期都需要是动态的

另一个主表是item表。我会展示我到目前为止所拥有的一切,但这将是一种帮助。我完全不知道该用什么样的方式来组织这件事

这是我最好的,但遗憾的是不完整和遗憾的尝试,展示我想要什么,以及我认为我可能如何实现它

With CTE_FirstSaleDate as 
(
 SELECT MIN(TransDate) as FirstSoldOn FROM InventoryTransaction
), 
WITH CTE_AllDatesTable
AS
(
  SELECT FirstSoldOn AS [date]
  UNION ALL
  SELECT DATEADD(dd, 1, [date])
  FROM CTE_DatesTable
  WHERE DATEADD(dd, 1, [date]) < DATEADD(dd, 30, FirstSoldOn)
),
CTE_OOS as
(
SELECT TOP 1 i.ItemCode, it.TransactionDate
FROM InventoryTransaction it
WHERE ( it.OnHandAfter = 0 )
ORDER BY it.TransactionDate DESC
)
Select i.ItemCode, DaysCount, DaysOOSCount, AvgDlyVol, AdjDlyVol 
From Items i
Join InventoryTransaction...

任何关于我如何能得到一堆表格、表格中没有的动态日期以及所有这些东西的帮助都将不胜感激。当然,如果有一个神奇的脚本,这将是可怕的,但这将是每月运行一次,所以分解它是好的

尝试以下方法以获得缺货天数:

;WITH CTE
AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY TransaDate) as RN
    FROM InventoryTransaction
)
SELECT c1.TransaDate, c2.TransaDate, DATEDIFF(d, c1.TransaDate, c2.TransaDate) As NumDays
FROM CTE C1
INNER JOIN CTE C2
    ON C1.RN = C2.RN - 1
WHERE C1.OnHandAfter = 0 AND C2.OnHAndBefore = 0
编辑

如果我假设ItemCode是链接某个特定项目的所有事务的thing列,从您的示例中看,这看起来不正确,那么该查询将起作用:

;WITH CTE
AS
(
    SELECT *
           ,ROW_NUMBER() OVER (Partition By ItemCode ORDER BY TransaDate) as RN
    FROM InventoryTransaction
)
SELECT c1.TransaDate, c2.TransaDate, 
       DATEDIFF(d, c1.TransaDate, COALESCE(c2.TransaDate, c1.TransaDate)) As NumDays
FROM CTE C1
LEFT JOIN CTE C2
    ON C1.RN = C2.RN - 1 AND C1.ItemCode = C2.ItemCode
WHERE C1.OnHandAfter = 0 AND C2.OnHAndBefore = 0

你是想知道缺货的实际日期,还是仅仅是天数?仅仅是天数。部分是为了计算调整后的日销售量,但也为了查看缺货的时间百分比。就像示例中的数据一样,在深入研究并意识到它几乎有50%的时间缺货之前,它看起来不会太糟糕。ItemCode是每个事务的唯一标识符,并且按顺序分配吗?ItemCode在Item表中是唯一的,而不是在InventoryTransaction表中。在InventoryTransaction、TransactionIDSorry中有更多的列,我在思考时用光了时间。TransactionID是InventoryTransaction中的唯一字段,但ItemCode不是。ItemCodes是根据添加到购物车的时间进行排序的。我希望这能回答这个问题。这是有效的。我已经测试了一些日期范围和不同的项目,我遇到的唯一问题是当项目在日期范围结束时脱销。例如,如果我的日期范围是03/01-03/31,并且该商品在03/30脱销,则结果显示c1.TransDate=2016-03-30、c2.TransDate=2013-07-17和NumDays=-987。我不知道2013-07-17下一行是如何找到的。也许我可以做一个简单的IF,如果NumDays小于0,那么EndDate-C2.TransDate.@user3096720如果您可以在问题中添加一些数据来显示这个问题,这会有所帮助。如果您有多个项目,那么您的加入也应该包括此项,我无法从您的示例数据中看到加入应该使用什么,因为您的项目代码似乎没有标识项目。您提供的第二个版本规则!我将要真正研究这一个,自连接分区CTE对我来说不容易想象或理解,但基于结果,我需要更多地使用它们。您提供的第一个版本工作正常,但运行大约需要2分钟。第二个版本在第二个版本下运行。太神了我假设是分区加快了速度,除非是左连接比内连接快。谢谢你,史蒂夫,谢谢你给我这个新的,闪亮的教育玩具。我现在真的头晕!