Страницы: 1
RSS
DAX. Мера вычисления среднедневных продаж в разных контекстах
 
Добрый день.
Есть таблица продаж за период в разрезе позиций и подразделений.
В PQ к таблице подтянул кол-во дней когда позиция была доступна для продаж.
Получившуюся таблицу передал в модель данных.
Возникла сложность в написании универсальной меры вычисления среднедневных продаж в разных контекстах.
В контексте кода написанная мной мера возвращает корректные данные, в остальных контекстах нет.
Иными словами:

Для расчета среднедневной продажи в контексте подразделения (или компании ) необходимо по позиционно рассчитать среднедневные продажи и сложить их. По позиционно, мера возвращает корректные данные, но как сложить полученные значения, не понимаю.


Прошу оказать помощь.
Пример во вложении.
 
так?

Код
if(ISFILTERED('Диапазон'[filial]);SUMX(SUMMARIZE('Диапазон';'Диапазон'[sku]);[av_sale]);[av_sale])
Изменено: mechanix 85 - 13.05.2024 16:28:36
 
Цитата
написал:
так?
Спасибо.
идею понял, буду пробовать
 
mechanix 85, попробуйте выбрать не один филиал, а несколько. То есть эту часть я вообще не понял: if(ISFILTERED('Диапазон'[filial]);...
И лучше не использовать меру ТС. А то излишние итераторы внутри итераторов...

Neostt, у Вас в данных одинаковое количество дней для разных филиалов и одинаковых sku. А если это не так будет? Как считать нужно? :)
Тогда у Вас и мера day неверно отработает.
Если число дней продаж sku в разных филиалах на один период всегда одинаково - то оставляйте свою. Только попроще ее перепишите:
Код
day :=
SUMX (
    SUMMARIZE ( 'Диапазон'; 'Диапазон'[date]; 'Диапазон'[sku] );
    CALCULATE ( MIN ( 'Диапазон'[n_day] ) )
)

По идее так (чтобы мера была аддитивной - в подытогах/итогах значение равнялось сумме по всем строкам в детализации) так:
Код
av_sale :=
SUMX (
    SUMMARIZE ( 'Диапазон'; 'Диапазон'[filial]; 'Диапазон'[sku] );
    VAR sales_amount = [sale_]
    VAR days_cnt =
        SUMX ( VALUES ( 'Диапазон'[date] ); CALCULATE ( MAX ( 'Диапазон'[n_day] ) ) )
    VAR av_s =
        DIVIDE ( sales_amount; days_cnt )
    RETURN
        av_s
)

Если же не бывает разного числа дней для разных филиалов у одного sku/периода, то будет чуть пошустрее:
Код
av_sale_2 :=
SUMX (
    VALUES ( 'Диапазон'[sku] );
    VAR sales_amount = [sale_]
    VAR days_cnt =
        SUMX ( VALUES ( 'Диапазон'[date] ); CALCULATE ( MAX ( 'Диапазон'[n_day] ) ) )
    VAR av_s =
        DIVIDE ( sales_amount; days_cnt )
    RETURN
        av_s
)
Изменено: surkenny - 13.05.2024 19:15:08
 
surkenny, Спасибо
 
Не получилось адаптировать предложенные варианты  решения к "рабочему примеру"
Приложил второй тестовый пример (упрощенный "рабочий")
на листе Этапы расчета - представил этапы расчета.
ps  количество дней для разных филиалов и одинаковых sku может быть разным, в т.ч. меняться в зависимости от даты
Прошу оказать помощь
спасибо.
Изменено: Neostt - 14.05.2024 15:31:07
 
Neostt, вы меру от surkenny неправильно адаптировали. Замените в мере av_sale строку
Код
VAR days_cnt =  SUMX ( VALUES ( 'Таблица1'[Код товара] ); CALCULATE ( MAX ( 'Таблица1'[Кол-во дней] ) ) )
на
Код
VAR days_cnt =  SUMX ( VALUES ( 'Таблица1'[Дата] ); CALCULATE ( MAX ( 'Таблица1'[Кол-во дней] ) ) )
Столбец не тот использовали, т.к. в мере от surkenny  было
Код
VAR days_cnt =
        SUMX ( VALUES ( 'Диапазон'[date] ); CALCULATE ( MAX ( 'Диапазон'[n_day] ) ) )
Изменено: Alex - 14.05.2024 16:18:30
 
Alex, Спасибо огромное, все заработало как надо.
Страницы: 1
Наверх