我正在使用 MS SQL Server。
我有下表:
SKU Shop WeekNum ShopPrioirty Replen OpeningStock
111 100 1 1 10 5000
111 200 1 2 10 NULL
111 300 1 3 5 NULL
111 400 1 4 8 NULL
222 100 2 1 20 6000
222 200 2 2 15 NULL
222 300 2 3 12 NULL
222 400 2 4 10 NULL
这是期望的结果:
SKU Shop WeekNum ShopPrioirty Replen OpeningStock
111 100 1 1 10 5000
111 200 1 2 10 4990
111 300 1 3 5 4980
111 400 1 4 8 4975
222 100 2 1 20 6000
222 200 2 2 15 5980
222 300 2 3 12 5965
222 400 2 4 10 5953
对于给定的一周,一个 SKU 存在于多个商店中并被分配了一个优先级。在优先级 1 处分配期初库存。
但是,我需要更新期初库存(当前为 NULL)以等于之前的期初库存减去之前的补货。
在我尝试更新之前,我试着做一个 SELECT
SELECT SKU
,Shop
,WeekNum
,StorePriority
,Replen
,OpeningStock
,OpeningStock - Replen OVER (ORDER BY SKU,Shop,WeekNum ROWS UNBOUNDED PRECEDING) AS Opening
FROM [table1] t
但我收到错误:关键字“OVER”附近的语法不正确。
运行总和是正确的方法吗?
是否最好创建一个由 SKU\Shop\WeekNum\Priority 组成的 key ?
谢谢。
最佳答案
我在这里对您的 PARTITION BY
和 ORDER BY
子句做了一些假设,但这会让您得到想要的结果。由于您在 SKU
的第一行中只有 OpeningStock
的值,因此我使用 FIRST_VALUE
获取第一个值,然后取去掉 Replen
的所有 prior 值:
WITH VTE AS(
SELECT *
FROM (VALUES(111,100,1,1,10,5000),
(111,200,1,2,10,NULL),
(111,300,1,3,5 ,NULL),
(111,400,1,4,8 ,NULL),
(222,100,2,1,20,6000),
(222,200,2,2,15,NULL),
(222,300,2,3,12,NULL),
(222,400,2,4,10,NULL))V(SKU,Shop,WeekNum,ShopPrioirty,Replen,OpeningStock))
SELECT V.SKU,
V.Shop,
V.WeekNum,
V.ShopPrioirty,
V.Replen,
V.OpeningStock,
FIRST_VALUE(V.OpeningStock) OVER (PARTITION BY V.SKU ORDER BY V.ShopPrioirty,V.WeekNum ROWS UNBOUNDED PRECEDING) -
ISNULL(SUM(V.Replen) OVER (PARTITION BY V.SKU ORDER BY V.ShopPrioirty,V.WeekNum ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0) AS CurrentStock
FROM VTE V;
关于sql - T SQL 累积减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56441047/