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代码是什么?
答案 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兼容语法)相同。