SQL - Алгоритм длительного инвентаризации - PullRequest
0 голосов
/ 25 января 2019

Требование таково. Мы хотим знать, как долго продлится количество товара с учетом прогноза на месяц + 1 к месяцу + x

Логика:

quantity / forecastNextMonth

но

if quantity > forecastNextMonth then
(1 + (quantity - forecastNextMonth)) / forecastNextMonth+2

Это должно быть применено и к месяцу + 3, так что это очень быстро запутывается в материалах дела.

if quantity > forecastNextMonth+2 then
(1 + (quantity - (forecastNextMonth + forecastNextMonth+2))) / forecastNextMonth+3

И окончательное решение также должно проверять наличие 0 значений bc деления на ноль ошибок.

Это пример sql для игры на скрипке. Я не в своей лиге, чтобы выразить это лучше математически.

create table #Temp
(
    Id int,
    Quantity decimal(10,2),
    Forecast decimal(10,2),
    WhatEverTimeStamp datetime,
    InventoryLasting decimal(4,2)
)

insert into #Temp
(Id, Quantity, Forecast, WhatEverTimeStamp)
VALUES
(1, 10, 0, '2019-01-01'),
(2, 20, 10, '2019-01-01'),
(3, 30, 30, '2019-01-01'),
(4, 100, 20, '2019-01-01'),
(5, 0, 10, '2019-01-01'),
(6, 0, 0, '2019-01-01')
;

SELECT
Id, Quantity, Forecast, WhatEverTimeStamp
, convert(decimal(4,2),
CASE WHEN Quantity > 0  
THEN
    CASE WHEN Quantity >= LEAD(Forecast, 1) OVER (PARTITION BY WhatEverTimeStamp ORDER BY WhatEverTimeStamp) 
    THEN
        CASE WHEN LEAD(Forecast, 2) OVER (PARTITION BY WhatEverTimeStamp ORDER BY WhatEverTimeStamp) > 0
        THEN
            1 + ((Quantity - LEAD(Forecast, 1) OVER (PARTITION BY WhatEverTimeStamp ORDER BY WhatEverTimeStamp))
            /
            LEAD(Forecast, 2) OVER (PARTITION BY WhatEverTimeStamp ORDER BY WhatEverTimeStamp))
        ELSE
            CASE WHEN Forecast > 0 THEN Quantity / Forecast ELSE 0 END
        END
    ELSE
        CASE WHEN Forecast > 0 THEN Quantity / LEAD(Forecast, 1) OVER (PARTITION BY WhatEverTimeStamp ORDER BY WhatEverTimeStamp)  ELSE 99 END
        --11
    END
ELSE
    0
END) AS InventoryLasting

FROM
#Temp


If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End

Для случая с идентификатором 4 это дело не является полным, потому что это будет слишком долго, я попытался описать его выше скрипки. Решение, в котором используется средний прогноз, исключается требованием.

...