Страницы: 1
RSS
Power Pivot. На сколько месяцев хватит запасов, Расчет на сколько месяцев хватит запасов
 
Коллеги, добрый день!

Подскажите, возможно ли посчитать на сколько месяцев хватит запаса с помощью меры в Power Pivot.
В приложенном файле по столбцу Ответственность - Запас это начальный запас, Нормативный запаса - это планируемый расход.
Логика расчета - каждый месяц, что остаток от запаса больше 0, считается за один месяц, там где остаток не набирается, то считаем долю на сколько хватает остатка к планируемому расходу.
Т.е. если запас 100, а расходы в первый месяц 90, во второй 90, то запаса хватает на 1,11 мес.
 
Цитата
Roman M написал:
возможно ли посчитать на сколько месяцев хватит запаса с помощью меры в Power Pivot.
Возможно. Но непонятно, что выводить в итогах по группе. К примеру, остаток mp1 в регионе1 для b2c 1; для b2b 100; расходы каждый месяц по 1 у всех. b2c хватит на 1 мес, для b2b на 100. Для всего региона по mp1 на сколько месяцев запас? Минимальный для всех типов?
Пока сделал расчет только для нижнего уровня:
Код
Остаток мес :=
VAR monthWhenProdEnd =
    CALCULATE (
        EDATE ( MAX ( 'Таблица1'[Период расхода] ); 1 );
        'Таблица1'[Остаток] >= 0
    )
VAR lastMonthPart =
    CALCULATE (
        DIVIDE ( SUM ( 'Таблица1'[Остаток] ); SUM ( 'Таблица1'[Количество] ) ) + 1;
        'Таблица1'[Период расхода] = monthWhenProdEnd;
        'Таблица1'[Ответственность] = "Нормативный запас"
    )
VAR countMonths =
    CALCULATE (
        DISTINCTCOUNT ( 'Таблица1'[Период расхода] );
        'Таблица1'[Остаток] >= 0;
        'Таблица1'[Ответственность] = "Нормативный запас"
    ) + lastMonthPart
VAR minOneMonth =
    IF ( countMonths > 0; MAX ( 1; countMonths ) )
VAR result =
    IF (
        HASONEVALUE ( 'Таблица1'[МР] ) && HASONEVALUE ( 'Таблица1'[Тип] )
            && HASONEVALUE ( 'Таблица1'[Регион] );
        minOneMonth
    )
RETURN
    result
 
Для Региона как сумма b2b+b2c запас относительно b2b+b2c расход.
т.е. запас b2b 100 + b2c 100
  1. расход первый месяц b2b 50 + b2c 50
  2. расход второй месяц b2b 25 + b2c 25
  3. расход второй месяц b2b 25 + b2c 25
Запаса хватит на 3 месяца.

И на уровень выше МР расчет будет аналогичен - как сумма всего, что ниже.
 
Roman M, описанное Вами не проблема посчитать. Я Вам о том, что это хрень, а не показатель:
запас b2b 100 + b2c 1
расход первый месяц b2b 50 + b2c 1 (а нужно было 50)
расход второй месяц b2b 25
расход второй месяц b2b 25
Какой общий запас? :)

А если Вы делите товар между b2b и b2с, зачем считать отдельный товарный запас для них? Ведь он в итоге не будет верным.
Изменено: surkenny - 31.01.2022 22:18:47
 
По примеру запас будет 3 месяца :) Просто между типами можно туда-сюда переносить запасы и поэтому считаем так.
 
А вот далее ещё интереснее:
запас регион1 10000 + регион2 10
расход первый месяц регион1 500 + регион2 10 (нужно 500)
расход второй месяц регион1 500
расход третий месяц регион1 500

расход двадцатый месяц регион1 500
На сколько месяцев запас обоих регионов? Перемещаете товар между регионами?

И на десерт :)
запас товар1 10000 + товар2 10
расход первый месяц товар1 500 + товар2 10 (нужно 500)
расход второй месяц товар1 500
расход третий месяц товар1 500

расход двадцатый месяц товар1 500
На сколько месяцев запас двух товаров? :)
В данном случае уж точно нет корректного общего показателя. Можно взять среднее взвешенное по стоимости запаса каждого товара.
 
Цитата
Roman M написал:
Просто между типами можно туда-сюда переносить запасы и поэтому считаем так.
Ок. Тогда просто уберите одно условие hasonevalue:
Код
Остаток мес :=
VAR monthWhenProdEnd =
    CALCULATE (
        EDATE ( MAX ( 'Таблица1'[Период расхода] ); 1 );
        'Таблица1'[Остаток] >= 0
    )
VAR lastMonthPart =
    CALCULATE (
        DIVIDE ( SUM ( 'Таблица1'[Остаток] ); SUM ( 'Таблица1'[Количество] ) ) + 1;
        'Таблица1'[Период расхода] = monthWhenProdEnd;
        'Таблица1'[Ответственность] = "Нормативный запас"
    )
VAR countMonths =
    CALCULATE (
        DISTINCTCOUNT ( 'Таблица1'[Период расхода] );
        'Таблица1'[Остаток] >= 0;
        'Таблица1'[Ответственность] = "Нормативный запас"
    ) + lastMonthPart
VAR minOneMonth =
    IF ( countMonths > 0; MAX ( 1; countMonths ) )
VAR result =
    IF (
        HASONEVALUE ( 'Таблица1'[МР] ) && HASONEVALUE ( 'Таблица1'[Регион] );
        minOneMonth
    )
RETURN
    result

А зачем тогда считать отдельно для каждого типа? Если делимся - у них будет именно общий товарный запас в месяцах.
 
Этот товар это СИМ-карты и перенеси их из одной категории в другую не очень сложно :) , а показываем мы отдельно для каждого типа для понимания как есть сейчас. Но если смотреть в целом по Регион и МР, то уже получается не важно к какому типу они относятся.
Сейчас ваш вариант все считает правильно, кроме одного условия, когда запасов изначально меньше чем на один месяц.
Вот эта часть возвращает пусто и дальше расчет нормально не делается
Код
VAR monthWhenProdEnd =
    CALCULATE (
        EOMONTH ( MAX ( 'SIM'[Период расхода] ); 1 );
        'SIM'[Остаток] >= 0
    )
И я не очень понимаю, как заставить взять в таком случае минимальную дату, по периоду расхода и тогда дальше расчет должен быть правильным.
 
Я логику Вашу из первого сообщения не понял. Мне показалось, что, если в первом месяце хоть что-то есть, то 1.
Код
Остаток мес :=
VAR monthWhenProdEnd =
    MAX (
        MIN ( 'SIM'[Период расхода] );
        CALCULATE ( EOMONTH ( MAX ( 'SIM'[Период расхода] ); 1 ); 'SIM'[Остаток] >= 0 )
    )
VAR lastMonthPart =
    CALCULATE (
        DIVIDE ( SUM ( 'SIM'[Остаток] ); SUM ( 'SIM'[Количество] ) ) + 1;
        'SIM'[Период расхода] = monthWhenProdEnd;
        'SIM'[Ответственность] = "Нормативный запас"
    )
VAR countMonths =
    CALCULATE (
        DISTINCTCOUNT ( 'SIM'[Период расхода] );
        'SIM'[Остаток] >= 0;
        'SIM'[Ответственность] = "Нормативный запас"
    ) + lastMonthPart
VAR result =
    IF ( HASONEVALUE ( 'SIM'[МР] ); countMonths )
RETURN
    result
 
А можно как-то в условие по поиску наименьшего месяца
Код
VAR monthWhenProdEnd =    MAX (
        MIN ( 'SIM'[Период расхода] );
        CALCULATE ( EOMONTH ( MAX ( 'SIM'[Период расхода] ); 1 ); 'SIM'[Остаток] >= 0 )
    )
вместо блока 'SIM'[Остаток] >= 0 прописать сумму по этому столбу? просто получается, что в целом по МР и Региону мне нужно считать сумму, чтобы получить наименьший месяц, а по факту получаю наибольший из всех. Приложил файл - с примером - в таблице Q-AC попытался подробнее расписать как должно получиться.
Перечитал почти все темы по нарастающему итогу, но так и не смог понять применимо ли к моей задаче :(
Если нельзя пойду перестраивать таблицу в вид подобный расчету, по идее в нем должно почти все работать...
Изменено: Roman M - 03.02.2022 15:55:01
 
Roman M, проверяйте:
Скрытый текст

upd: Случайно в коде оставил переменную ненужную. Исправил.
Изменено: surkenny - 03.02.2022 19:06:24
 
Большое спасибо! Тема закрыта, все считает как нужно. Оказывается все достаточно просто, но я не туда пытался SUMMARIZE применить )
Страницы: 1
Наверх