Страницы: 1
RSS
DAX (PP). Расчет: Абсолютное отклонение выручки неделя к неделе
 
Добрый день.

Так как же как и многие начинаю изучать DAX, так как пришло осознание на сколько мощный это инструмент, но не все ошибки пока удается решить самостоятельно.
задача достаточно простая, нужно посчитать абсолютное отклонение прошлой недели к позапрошлой. Есть данные за последние 8 недель, Форму таблицы менять нельзя. Создал отдельно на листе справочник с прошлой неделей и позапрошлой:
Справочник1
WeekNumberWeekAttribute
33.2020TwoWeekAgo
34.2020OneWeekAgo
Так выглядят сгруппированные в сводник (pp) данные:
Сводная   по таблице 1
WeekAttribute(несколько   элементов)
ПолучилосьДолжно быть
WeekNumberФилиалВыручка__ПриростВыручкаоткл. Нед к нед
33.2020110 000 000-10 000 000
33.20202150 000 000-150 000 000
33.202033 000 000-3 000 000
33.2020 Итог 163 000 000-163 000 000
34.2020111 000 00011 000 0001 000   000
34.20202145 000 000145 000 000-5 000   000
34.202032 700 0002 700 000-300   000
34.2020 Итог 158 700 000158 700 000-4 300   000
Формула:
_ПриростВыручка:=
SUMX(FILTER('Продажи';RELATED('Недели'[WeekAttribute])="OneWeekAgo");'Продажи'[Оборот (с НДС)]) -

SUMX(FILTER('Продажи';RELATED('Недели'[WeekAttribute])="TwoWeekAgo");'Продажи'[Оборот (с НДС)])

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

 
Доброе время суток
Цитата
Compton написал:
начинаю изучать DAX, так как пришло осознание на сколько мощный это инструмент
Вы не поверите, но ещё более мощный инструмент в получении помощи - это файл пример :)
 
Согласен :)  Подготовил пример, пришлось немного поменять названия столбцов и заменить оборот.
Файл выложил на Я.Д. иначе не помещается.
https://yadi.sk/d/iQOZQloHGZZrPA
 
Ровно под вашу задачу и под то, как Вы сделали справочник недель:
Код
=
IF(
    MAX( 'спрНед'[ПризнакНедели] ) = "OneWeekAgo";
    CALCULATE(
        [_Оборот];
        ALL( 'спрНед' );
        'спрНед'[ПризнакНедели] = "OneWeekAgo"
    )
        - CALCULATE(
            [_Оборот];
            ALL( 'спрНед' );
            'спрНед'[ПризнакНедели] = "TwoWeekAgo"
        )
)

По-хорошему, вам надо сделать сквозную нумерацию недель между годами.
Учтите, что метка признака недели должны быть именно такая, чтобы срабатывала 3-я строка формулы. Но в целом - как удобно. Главное, чтобы она отлавливалась и была первой по алфавиту.
оффтоп:
F1 творит чудеса
 
Максим, Спасибо!
Был очень близок к подобному решению, через IF, но запутался в конструкции CALCULATE.

Первый курс посмотрел от специалиста по "Excel Уровень 7", но там больше моделирование и знакомство с PP. Сейчас смотрю, и это ответ на вопрос, курс от Антона Будуева - https://biprosto.ru/dax. До этого 90% задач получалось решить с помощью FILTER :D . После уже перейду к "Специалист уровень 8: DAX".
Наколхозил что ли? :D Пока за пол курса, по большому счету познакомился только с FILTER,  ALL и X функциями, поэтому большинство решений только через них.
 
Не то, чтобы наколхозили... Мне сложно объяснить так быстро, что меня удивило. Вы в вот этой формуле
Код
SUMX(FILTER('Продажи';RELATED('Недели'[WeekAttribute])="OneWeekAgo");'Продажи'[Оборот (с НДС)])
делаете даже не то чтобы ошибку. Вы очень странно используете связи между таблицами:
Код
RELATED('Недели'[WeekAttribute])="OneWeekAgo")

равнозначно
Код
'Недели'[WeekAttribute])="OneWeekAgo"

без всяких RELATED.
и хотя внутри (с точки зрения физического запроса) ваша формула идентична
Код
CALCULATE(SUM('Продажи'[Оборот (с НДС)]);KEEPFILTERS('Недели'[WeekAttribute])="OneWeekAgo"))
последняя формула выглядит проще и более управляема, как мне видится - я могу добавлять или изменять контекст в аргументах CALCULATE куда как свободнее, чем в аргументах FILTER.
Ну и в итоге для того, чтобы добавить сброс фильтров по справочнику недель, вам придется прямо извращаться.
F1 творит чудеса
Страницы: 1
Наверх