T SQL CTE Вычисление предыдущей строки - PullRequest
2 голосов
/ 13 июня 2019

Я использую SQL Server 2016.

У меня есть таблица ниже:

SKU     Shop       Week    ShopPrioirty    Replen      Open_Stk  Open_Stk Calc
111     100         1            1           0           17         NULL
111     200         1            2           2           NULL       NULL 
111     300         1            3           0           NULL       NULL
111     400         1            4           0           NULL       NULL

222     100         2            1           5          17          NULL 
222     200         2            2           5          NULL        NULL
222     300         2            3           5          NULL        NULL
222     400         2            4           5          NULL        NULL

Это желаемый результат:

SKU     Shop      Week    ShopPrioirty    Replen      Open_Stk  Open_Stk Calc
111     100         1            1           0           17         17
111     200         1            2           2          NULL        17
111     300         1            3           0          NULL        15
111     400         1            4           0          NULL        15

222     100         2            1           20           17        17
222     200         2            2           15          NULL       12
222     300         2            3           12          NULL        7
222     400         2            4           10          NULL        2

Мне нужнообновить 'Open_Stk Calc' на основе предыдущей строки:

'Open_Stk Calc' - IIF('Replen'<=IIF('Open_Stk'>=0,'Open_Stk',0),'Replen',0)

Я использую CTE для обновления строки на основе вычисления предыдущих строк.Это мой SQL:

    ;WITH CTE AS 
    (
        SELECT
        SKU,
        [Shop],
        [Week],
        [Store_Priority],
        [Replen],      
        [Open_Stk],
        [Open_Stk Calc],
        FIRST_VALUE([Open_Stk]) OVER ( PARTITION BY [SKU] ,[Week] ORDER BY [Store_Priority] ROWS UNBOUNDED PRECEDING) 
        - 
ISNULL(SUM(IIF([Replen] <= IIF([Open_Stk]>=0,[Open_Stk],0),[Replen],0))
        OVER (PARTITION BY [SKU] ,[Week] ORDER BY [Store_Priority] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) AS CurrentStock
    FROM [tblTEST])

    UPDATE CTE 
    SET [Open_Stk Calc] = CurrentStock

Однако это приводит к следующему результату:

SKU     Shop       Week    ShopPrioirty    Replen      Open_Stk  Open_Stk Calc
111     100         1            1           0           17         17
111     200         1            2           2           NULL       17 
111     300         1            3           0           NULL       17
111     400         1            4           0           NULL       17

А не желаемый результат - где я ошибся?

1 Ответ

1 голос
/ 13 июня 2019

Как видно из документации MS , пункты OVER поддерживают функции определенного типа:

Ranking functions 
Aggregate functions 
Analytic functions 
NEXT VALUE FOR function

Ни одна из них не включает IIF, как отметил Луис Казаресв своем комментарии.

Ваш код указывает, что вы делаете подсказку о том, что вы делаете - может быть, вы забыли поместить свой IIF в SUM?

...