DAX
May 31, 2022

#PowerBI: как сравнить прошлый и текущий год?

Наверное, самый частый приём аналитика - сравнение текущего значения со значением предыдущего периода. Это позволяет понять динамику - в ту ли мы сторону идём и предпринять соответствующие действия.

Для работы с датами в языке #DAX используются функции серии Time intelligence, а также специальная таблица-справочник "Календарь". Я написал серию статей "Биг Дата" (1, 2, 3) о том, как правильно работать с датами. Советую прочитать сначала их, если вы только начинаете работать в #PowerBI.

В этот раз хочу разобрать работу одной функции, которую я использую наиболее часто для сравнения периодов - DATEADD.

Возьмём уже знакомый dataset о продажах:

Модель Adventure Works

Dataset содержит информацию о продажах с 01.01.2015 по 30.06.2017 года. Создадим визуализацию с информацией о сумме продаж с разбивкой по годам:

Продажи за три года

Далее создадим меру, которая вернёт сумму продаж за предыдущий год:

Мера продаж за предыдущий год

Функция DATEADD принимает три аргумента: 1. Ссылка на столбец дат в таблице Календарь; 2. На сколько периодов сдвинуть вперёд или назад (со знаком минус); 3. Какой тип периода использовать (Год - Year, Квартал - Quarter, Месяц - Month, День - Day).

Так как на странице пока нет никаких фильтров, то к мере применяется только контекст вычисления текущей строки визуализации - номер года. Поэтому при сдвиге дат по календарю мы получаем даты за полный год.

Чтобы это проверить, создадим две меры, которые будут возвращать максимальную (последнюю) дату в текущем контексте.

Последняя дата в текущем контексте

Напомню, что данные о продажах содержат информацию только до 30.06.2017, то есть мы видим положительную динамику 2017 года относительно 2016 года, но на самом деле сравниваем продажи за полгода с продажами за целый год, а значит рост относительно предыдущего года, если сравнить с аналогичным периодом, будет ещё более весомым. Для наглядности создадим меру сравнения и добавим срез по дате на страницу.

Относительное изменение продаж

Сравнение аналогичных периодов показывает кратный рост продаж, а не "всего лишь" +25%, если сравнивать с полным годом.

Но фильтр по срезу создал "проблему" - исчезли продажи за 2015 и 2016 год.

Конечно, можно создать ещё одну меру, которая будет возвращать продажи со сдвигом на 2 года:

Продажи за позапрошлый год

Затем ещё одну меру, которая сравнивает продажи за прошлый и позапрошлый год между собой. А если будет необходимо вывести 3, 5, 10 лет? Плодить столько мер совсем не хочется - в них очень просто будет запутаться. Гораздо проще сделать дополнительную разметку в таблице Календарь.

Для этого создадим вычисляемый столбец:

Разметка Календаря

В переменной _today я использовал конкретную дату, так как продажи заканчиваются в 2017 году, а так можно воспользоваться функцией TODAY.

В переменной _Date используем год даты текущей строки, а месяц и день берём из "сегодня".

Остаётся только сравнить дату текущей строки с полученным значением. Дополнительно я использую функцию INT, которая превращает результат логического выражения True или False в 1 или 0 соответственно, так как #PowerBI не позволяет использовать бинарные значения в боковой панели фильтров.

Удалим срез по дате со страницы и добавим срез по созданному столбцу:

Динамика по аналогичным периодам за все года

Как видно на скриншоте - теперь присутствуют все года, что позволяет сравнивать аналогичные периоды, не перегружая модель мерами или сложными расчётами.

Также прикладываю ссылку на файл.