-1

我在 azure sql DW 中维护库存,并想计算一天的初始和最终库存。前一天的最终库存为当天的初始库存,当日的最终库存为初始库存+生产-销售。我有生产和销售数量的详细信息。如何计算初始数量和最终数量。

我可以使用滞后函数,但无法添加计算值以在同一查询中获得最终数量。

我想写但不起作用的查询是

从表中选择 lag(finalquantity,1) over ( Partition by Productid Order by Date) 作为 Initialqty,(Initialqty+Produced-sold) 作为 finalquantity

最终数量应作为下一条记录的初始数量。我希望这递归地发生。

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

0

我的答案直接基于此答案的Recursive CTEs部分中的第二个查询。

当我了解您的情况时,我创建了一个库存表。我的解决方案基于InventoryDate,而不是星期几。我要提到的最后一项是您的初始库存编号来自前一周的最终库存编号。但是,这必须在某个地方定义。我将它硬编码为递归 CTE 的锚成员。您可以将其作为参数传入或使用子查询获取。

CREATE TABLE Inventory
(
    InventoryDate DATE
  , Produced INT
  , Sold INT
);

INSERT INTO Inventory
(
    InventoryDate
  , Produced
  , Sold
)
VALUES
  ('2020-07-20', 10,  8)
, ('2020-07-21',  9,  7)
, ('2020-07-22', 11, 10)
, ('2020-07-23', 10, 10)
, ('2020-07-24',  9,  8)
, ('2020-07-25',  7,  8)
, ('2020-07-27', 12, 14);

WITH y AS
(
    SELECT
         rn = ROW_NUMBER() OVER (ORDER BY InventoryDate)
       , InventoryDate
       , Produced
       , Sold
    FROM Inventory
)
   , x AS
(
    SELECT
         CONVERT(BIGINT, 0)                   AS [rn]
       , DATEADD(DAY, -1, MIN(InventoryDate)) AS [IventoryDate]
       , NULL                                 AS [Initial]
       , NULL                                 AS [Produced]
       , NULL                                 AS [Sold]
       , 80                                   AS [Final]
    FROM Inventory
    UNION ALL
    SELECT
               y.rn
             , y.InventoryDate
             , x.Final                       AS [Initial]
             , y.Produced
             , y.Sold
             , x.Final + y.Produced - y.Sold AS [Final]
    FROM       x
    INNER JOIN y ON y.rn = x.rn + 1
)
SELECT 
     x.rn
   , x.IventoryDate
   , x.Initial
   , x.Produced
   , x.Sold
   , x.Final
FROM x;

这是此代码的演示

于 2020-07-25T04:29:27.170 回答