T SQL совокупное вычитание - PullRequest
1 голос
/ 04 июня 2019

Я использую 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

Но я получаю ошибку: Incorrect syntax near the keyword 'OVER'.

Является ли текущая сумма правильным путем?

Будет ли лучше создать ключ из SKU \ Shop \ WeekNum \ Priority?

Спасибо.

1 Ответ

5 голосов
/ 04 июня 2019

Я сделал несколько предположений здесь относительно ваших PARTITION BY и ORDER BY предложений, но это дает вам результат, к которому вы стремитесь. Поскольку у вас есть только значение OpeningStock в первой строке для SKU, тогда я использую FIRST_VALUE, чтобы получить первое значение, а затем убираю все предыдущие значения Replen:

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;
...