
Мелкие радости - быстрые меры, или хозяйкам на заметку
Рвав-рвав, сегодня я – собака-грязесобирака!
Перед вами – 5-я заметка из нашего цикла “Мелкие радости”, и ниже мы рассмотрим использование функционала построения мер при помощи встроенного мастера – так называемые “Быстрые меры”. Принцип работы с функционалом будет рассмотрен на примере рассчета накопительного итога.
Пример:
Имеется набор данных, содержащий распределение различных сумм в разрезе статьи (столбец “Строка отчета”), и периода (соответствующие столбцы месяцев):
Задача:
Рассчитать суммы накопительного итога в разрезе соответствующего периода времени (месяц), используя 2 способа создания конечного рассчета:
– быстрые меры – построение автоматическим путем;
– обычные меры – построение вручную.
Решение при помощи функционала “Быстрые меры”:
Данный функционал построения мер ”…запускает набор команд DAX в фоновом режиме на основе данных, которые вы вводите в диалоговое окно…“.
По сути – это некий помощник пользователя, предлагающий использовать встроенные механизмы для выполнения тех или иных рассчетов.
Для запуска данного функционала можно, например, нажать кнопку “New Quick Measure” (“Новая быстрая мера”), расположенную на закладке “Home” (“Главная”):
После этого необходимо выбрать нужный тип рассчета (в нашем случае это “Нарастающий итог”) и заполнить соответствующие поля:
В результате данных дейстыий будет сформирована конструкция следующего вида (имя по умолчанию изменено):
Построение автоматически =
CALCULATE (
SUM ( 'Dataset'[Amount] ),
FILTER (
CALCULATETABLE (
SUMMARIZE ( 'Dataset', 'Dataset'[Month_Number], 'Dataset'[Month_Name] ),
ALLSELECTED ( 'Dataset' )
);
ISONORAFTER (
'Dataset'[Month_Number], MAX ( 'Dataset'[Month_Number] ), DESC,
'Dataset'[Month_Name], MAX ( 'Dataset'[Month_Name] ), DESC
)
)
)
Рвав-рвав, как вы видите, конструкция довольно монструозная (аж лапки подрагивают!), но зато для того, чтобы ее построить, потребовались минимальные усилия!
Решение при помощи обычной меры, порстроенной вручную:
Формирование меры для подсчета нарастающего итога вручную предполагает некоторые дополнительные действия со стороны конечного пользователя, а именно – получение значения даты конца месяца, например, созданием дополнительного расчетного столбца, имеющего следующую формулу:
Month_End =
EOMONTH ( 'Dataset'[Date], 0 )
Конструкция нужной меры будет выглядеть следующим образом:
Построение вручную =
CALCULATE (
SUM ( 'Dataset'[Amount] ),
FILTER (
ALL ( 'Dataset' ),
'Dataset'[Month_End] <= MAX ( 'Dataset'[Month_End] )
),
VALUES ( 'Dataset'[Row] )
)
Рвав-рвав, здесь конечная формула получилась гораздо “легче”, и теперь главное – это проверить корректность полученного результата.
Проверка результатов:
Для проверки результатов были предварительно построены следующие визуализации:
– 2 таблицы (по одной на каждый вид рассчета), с использованием элемента “Matrix” (“Матрица”);
– Визуальный фильтр по строкам отчета, с использованием элемента “Slicer” (“Срез”);
– Визуальный фильтр по месяцам, с использованием элемента “Slicer” (“Срез”).
При отсутствии фильтров оба рассчета идентичны и работают корректно, поскольку значение нарастающего итога для месяца “Март” считается как:
– для 1-ой строки: 100 + 200 + 300 = 600;
– для 2-ой строки: 400 + 500 + 600 = 1500.
Рвав-рвав, по результатам проверки задача считается выполненной, но, как всегда “Дьявол кроется в деталях”.
Если отфильтровать данные по какой-то строке, например, по значению “Статья 1”, оба рассчета также идентичны:
Если отфильтровать данные по какому-то столбцу, например, по значениям “Январь” и “Март”, итоговые цифры не будут равны друг другу, так как для значения “Март” быстрая мера показывает результат наростающего итога, равный “400”, а ручная – “600”:
Выводы собаки Смайла:
Как уже говорилось выше, в принципе, задача решена, поскольку при отсутствии фильтра по периоду рассчеты обоими способами идентичны;
При использовании механизма “Быстрые меры” в рассчетах присутствует некая дополнительная логика (при фильтрации периода в значение нарастающего итога берется то, что указано явным образом, то есть для значения “Январь” – “100”, а “Март” – “300”, сумма чего и составляет показанные в отчете “400”.
Ручная мера также стабильно показывает для значения “Март” нужные “600” даже при фильтрации периода, однако это неявное поведение, по сути фильтр здесь влияет только на количество столбцов визуального элемента;
Дополнительная логика, встроенная в механизм “Быстрые меры” иногда может быть не совсем понятна конечному пользователю, однако это не означает, что данная конструкция является неправильной / некорректной / и пр., просто она другая, и ее применение может быть действительно обосновано.
Танки грязи не боятся,
Ваш Смайл