Страницы: 1
RSS
Расчет средних продаж за 3 мес. при выборе нескольких месяцев на срезе __ Power BI / DAX
 
Подскажите, пожалуйста, где у меня ошибка или недостаточно указано условий, я новичок в DAX
Буду рада любой наводке "что почитать, где поискать"

Есть формула расчета средних продаж за 3 предыдущих месяца

ср.пр. за 3 мес. =
var maxdate = CALCULATE( MAX('Календарь'[ДАТА]); DATEADD('Календарь'[ДАТА];-1;MONTH))
var mindate = CALCULATE(MIN('Календарь'[ДАТА]); DATEADD('Календарь'[ДАТА];-3;MONTH))
return
(CALCULATE(
  SUM('статистика продаж'[Выручка]);
  FILTER(ALL('Календарь');
     'Календарь'[ДАТА]>=mindate&&'Календарь'[ДАТА]<=maxdate
  ))/3
)

Если выбирать 1 месяц на срезе - всё ок, Если 2 и более, числа неадекватными становятся. Не понимаю даже что он суммирует в таких случаях
Множественный выбор нельзя убирать

нужно чтобы выбирал меньший месяц из указанных на срезе  и от него шагал назад
Изменено: Ксения Зинченко - 27.05.2024 05:39:43
 
Доброго времени  суток!
Ксения Зинченко, в срезе у вас только месяцы, дат нет?
Если у вас выбраны два месяца в срезе, например июнь и июль, то от июля 1 месяц будет июнь, а от июня 3 месяца будет март, и в итоге у вас получается с марта по июнь 4 месяца.
 
https://www.sqlbi.com/articles/rolling-12-months-average-in-dax/
 
Lari, да в срезе только месяцы

Спасибо большое за объяснение. Попробую поиграть с min=max
И вероятно деление на 3 стоит заменить на счет месяцев
 
Ксения Зинченко,  мой вариант решения
Код
=
VAR _StartDate =
    EDATE ( FIRSTDATE ( 'Календарь'[ДАТА] ), -3 )
VAR _EndDate =
    EOMONTH ( LASTDATE ( 'Календарь'[ДАТА] ), -1 )
VAR _period =
    DATESBETWEEN ( 'Календарь'[ДАТА], _StartDate, _EndDate )
VAR _t =
    CALCULATE (
        AVERAGEX (
            VALUES ( 'Календарь'[Год_Месяц] ),
            CALCULATE ( SUM ( 'статистика продаж'[Выручка] ) )
        ),
        _period
    )
RETURN
    _t
Изменено: Lari - 28.05.2024 12:27:18 (Скорректировал код с учетом заменчания от Alex)
 
Lari, добрый день. Можно добавлю комментарий к Вашей мере. Думаю, что функция EDATE не совсем удачна для  переменной VAR _EndDate =    EDATE ( LASTDATE ( 'Календарь'[ДАТА] ), -1 ), т.к. вернет не последний день месяца,  а дату с отступом на месяц, например для 30.04.2024 вернется 30.03.2024.
При этом исходя из
Цитата
написал:
нужно чтобы выбирал меньший месяц из указанных на срезе  и от него шагал назад
наверное, можно так VAR _EndDate =    FIRSTDATE ( 'Календарь'[ДАТА] ) - 1 либо VAR _EndDate =    EOMONTH( FIRSTDATE ( 'Календарь'[ДАТА] ), -1 )
Изменено: Alex - 28.05.2024 12:19:23
 
Alex, да, вы правы, спасибо за замечание, исправил у себя в коде.
Цитата
VAR _EndDate =    FIRSTDATE ( 'Календарь'[ДАТА] ) - 1 либо VAR _EndDate =    EOMONTH( FIRSTDATE ( 'Календарь'[ДАТА] ), -1 )
только я не понял почему вы используете для определения последнего дня в периоде FIRSTDATE, т.к. если выбраны в срезе 2 месяца то нужен из ТЗ минус один месяц от последнего месяца.
 
Lari, не знаю какая логика у ТС, но так я понял из
Цитата
написал:
нужно чтобы выбирал меньший месяц из указанных на срезе  и от него шагал назад
Т.е. возьмем для примера период в срезе 01.04.2024-31.05.2024. Со стартовой датой все однозначно для 01.04.2024 - будет 01.01.2024. А вот с конечной: если взять VAR _EndDate =    EOMONTH ( LASTDATE ( 'Календарь'[ДАТА] ), -1 ), то мы получим для 31.05.2024 дату 30.04.2024, соответственно период составит не 01.01.2024-31.03.2024, а 01.01.2024-30.04.2024. А если возьмем FIRSTDATE для периода, то мы получим как раз 31.03.2024. после EOMONTH ( FIRSTDATE ( 'Календарь'[ДАТА] ), -1 )
Изменено: Alex - 28.05.2024 13:05:47
 
Alex, что ж , ТС может выбрать любой вариант по вкусу.
 
Добрый день!

Возможно Вам будет полезен мой пример. Данной мерой рассчитывал среднее количество отгруженного товара за три месяца.

Отгружено USD Сред3М = IF(
   ISFILTERED('Отгружено Calendar'[Месяц]),
    AVERAGEX(
    WINDOW(
        -2, REL,
        0, REL,
        SUMMARIZE(
            ALLSELECTED('Отгружено Calendar'),
            'Отгружено Calendar'[Год],
            'Отгружено Calendar'[Месяц],
            'Отгружено Calendar'[Месяц номер]),
        ORDERBY('Отгружено Calendar'[Год], ASC, 'Отгружено Calendar'[Месяц номер], ASC),
        DEFAULT, PARTITIONBY('Отгружено Calendar'[Год])),
        [Сумма usd] + 0))
 
Alex, Lari, спасибо Вам огромное! То, сколько в ваших головах знаний и как работает логика, вызывает большое уважение и восторг.


Результат у меня такой:

СР ПРОД =

VAR _StartDate = EDATE(FIRSTDATE('Календарь'[ДАТА]);-3)

VAR _EndDate =    EOMONTH( FIRSTDATE ( 'Календарь'[ДАТА] ); -1 )

VAR _period = DATESBETWEEN('Календарь'[ДАТА]; _StartDate; _EndDate)

VAR _t = CALCULATE( AVERAGEX(VALUES('Календарь'[месяц+год]); CALCULATE(SUM('статистика продаж'[Выручка]))); _period)
       RETURN _t




R0m@n, спасибо большое за ваш вариант, напомнило sql запрос. Очень интересный подход. Обязательно попробую адаптировать под себя.



// казалось бы просто ср.продажи, а тут целый мир открывается! это очень интересно!
Страницы: 1
Наверх