SQL基于其他行的位置

时间:2016-07-18 11:11:59

标签: sql sql-server

SKU STORE DAY INVENTORY(start of day) DEMAND RECEIPTS
1   x     1   5                         10      9
1   x     2   =5-10+9

我正在尝试根据前一天的库存水平,需求和库存收据预测库存水平。我需要它足够强大,以便拥有许多独特的store-sku-day组合的数据库。

E.g。

UPDATE table
SET inventory=inventory(prior day)+receipts(prior day)-demand(prior day)

这是在Microsoft SQL

实现此目的的正确SQL代码是什么?

3 个答案:

答案 0 :(得分:0)

试试这个

UPDATE TBL
SET inventory = (PriviosDay.inventory + PriviosDay.receipts - PriviosDay.demand)
FROM (SELECT [DAY] + 1, inventory, receipts, demand) AS PriviosDay
WHERE
    TBL.[DAY] = PriviosDay.[DAY]

答案 1 :(得分:0)

我过去对此的看法如下。首先,您需要一个表,每个商店一行,然后是每个sku一行的表。然后你有一个事务表,每个reciept有一行,每次减少有一行。通过这种方式,您可以获得确定任何时间点的库存水平所需的数据。

接下来,您创建一个视图,该视图连接上表中的数据并采用日期的可选参数,如果填充它将告诉您该特定日期的库存水平。如果你想要那么准确,你可以制作那个日期时间。

当前库存的视图看起来像这样。

Select I.SKU, Store, Reciepts - Demand TotalInventory
   From Items I
   Join Transactions T On T.ItemID = I.ID
   Join Store S On S. = T.StoreID
   Where T.Date <= @DateParameter  -- This gives endof day, < gives end of previous day.
   Group By I.SKU, S.Store

当然库存系统会变得复杂得多,这只是一个基本的例子。

答案 2 :(得分:0)

这是一个使用窗口函数的解决方案。它假定给定商店的最旧记录(最低值)正确设置库存值:它是将计算值从那里级联到下一个的起点记录。计算中将忽略所有其他存储的库存值。

然后,更新仅在与计算值不同时更新库存值。因此,如果一切都已经正确,则不会更新任何内容。

查询有一个子查询( calc ),它进行库存计算,获取商店的初始库存,添加所有(收据 > - 要求),直至但不包括当前记录的日期。

请注意,如果日序列中存在空白,这也会有效。

update t
set    inventory = calc.inventory
from   (select sku,
               first_value(inventory) over (
                   partition by store
                   order by day
                   rows unbounded preceding)
               + sum(receipts-demand) over (
                   partition by store
                   order by day
                   rows unbounded preceding)
               + demand - receipts as inventory
        from   t) as calc 
where  t.sku = calc.sku
and    (t.inventory is null or t.inventory <> calc.inventory);

这是SQL fiddle

请注意,我必须在Postgres引擎上做小提琴,因为SQL Server引擎几乎不可用。但对于此查询,语法与SQL Server(SQL:2008兼容语法)相同。