Given the table with the initial number of units in stock, with the forecast consumption of goods per week: (Stocks: SKU_Name(pk название товара) , Volume_tons(начальное кол-во единиц товара)) , (Forecast: SKU_NAME(fk название товара) , Week_Number (номер недели) , Volume_tons (прогноз расхода)) .

Need to calculate how many days should be enough goods.

The pseudo-code calculation algorithm is obtained; can it be translated into T-SQL syntax without using temporary tables ?:

 if ((stocks.volume_tons - SUM(forecast.volume_tons)) < 0) { int cover = 7 * ((forecast.week_number - 1) + (stocks.volume_tons - SUM(forecast.volume_tons)-forecast.volume_tons)/forecast.volume_tons) 

Here is such a script:

 DECLARE @intFlag INT, @weekCount INT, @nameSKU varchar(4), @cover float; --объявление счётчика, числа недель, названия SKU, покрытия в днях SET @intFlag = 0; --счётчик сбрасываем на ноль SET @weekCount = 5; --число недель берём = 5 SET @nameSKU = 'SKU6'; --задаём SKU WHILE (@intFlag <= @weekCount) --пока не достигли последней недели BEGIN SET @intFlag = @intFlag + 1; --инкремент счетчика. начинаем сразу с 1 недели -- если на конец недели остаётся отрицательное количество SKU IF ((select volume_tons from stocks where SKU_Name=@nameSKU) - --объем начального стока для заданного SKU (select sum(volume_tons) from forecast where SKU_Name=@nameSKU and Week_number<=@intFlag)) < 0 --сумма всех прогнозируемых продаж до текущей недели включительно BEGIN DECLARE @lastWeekStock float, @curWeekForecast float; --объявили буферные переменные для хранения временных значений для удобства чтения запроса (Сток к концу прошлой недели и прогноз продаж на текущей) --предусматриваем ситуацию, когда начальный сток < прогноза продаж на 1 неделе IF (@intFlag < 2) SET @lastWeekStock = (select volume_tons from stocks where SKU_Name=@nameSKU); --объем начального стока для заданного SKU ELSE SET @lastWeekStock = (select volume_tons from stocks where SKU_Name=@nameSKU) - --объем начального стока для заданного SKU (select sum(volume_tons) from forecast where SKU_name=@nameSKU and Week_number<@intFlag); --сумма прогнозируемых продаж до предыдущей недели включительно SET @curWeekForecast = (select volume_tons from forecast where SKU_name=@nameSKU and Week_number=@intFlag); --прогноз продаж на текущей неделе --предусматриваем ситуацию, когда прогноз продаж = 0, чтобы не делить на ноль и перейти на следующую неделю IF (@curWeekForecast = 0) CONTINUE; --7 дней х (кол-во недель до текущей + сток к концу прошлой недели / прогноз продаж на текущей неделе) ELSE BEGIN SET @cover = 7 * (@intFlag - 1 + @lastWeekStock / @curWeekForecast); --7 дней х (кол-во недель до текущей + сток к концу прошлой недели / прогноз продаж на текущей неделе) PRINT @cover; --вывод на экран покрытия в днях BREAK; END; END; END; GO 
  • You can try in LinqPad to write code on Linq2Sql and get automatically generated SQL. - Alexander Petrov

0