Post-Image

Мелкие радости - быстрые меры, или хозяйкам на заметку

Рвав-рвав, сегодня я – собака-грязесобирака!

Перед вами – 5-я заметка из нашего цикла “Мелкие радости”, и ниже мы рассмотрим использование функционала построения мер при помощи встроенного мастера – так называемые “Быстрые меры”. Принцип работы с функционалом будет рассмотрен на примере рассчета накопительного итога.

Пример:

  • Имеется набор данных, содержащий распределение различных сумм в разрезе статьи (столбец “Строка отчета”), и периода (соответствующие столбцы месяцев):

    blog_007_screen_1

    Задача:

    Рассчитать суммы накопительного итога в разрезе соответствующего периода времени (месяц), используя 2 способа создания конечного рассчета:

    – быстрые меры – построение автоматическим путем;

    – обычные меры – построение вручную.

    Решение при помощи функционала “Быстрые меры”:

    Данный функционал построения мер ”…запускает набор команд DAX в фоновом режиме на основе данных, которые вы вводите в диалоговое окно…“.

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

  • Для запуска данного функционала можно, например, нажать кнопку “New Quick Measure” (“Новая быстрая мера”), расположенную на закладке “Home” (“Главная”):

    blog_007_screen_2

  • После этого необходимо выбрать нужный тип рассчета (в нашем случае это “Нарастающий итог”) и заполнить соответствующие поля:

    blog_007_screen_3

  • В результате данных дейстыий будет сформирована конструкция следующего вида (имя по умолчанию изменено):

    Построение автоматически =
    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 )

    blog_007_screen_4

  • Конструкция нужной меры будет выглядеть следующим образом:

    Построение вручную =
    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.

    blog_007_screen_5

    Рвав-рвав, по результатам проверки задача считается выполненной, но, как всегда “Дьявол кроется в деталях”.

  • Если отфильтровать данные по какой-то строке, например, по значению “Статья 1”, оба рассчета также идентичны:

    blog_007_screen_6

  • Если отфильтровать данные по какому-то столбцу, например, по значениям “Январь” и “Март”, итоговые цифры не будут равны друг другу, так как для значения “Март” быстрая мера показывает результат наростающего итога, равный “400”, а ручная – “600”:

    blog_007_screen_7

    Выводы собаки Смайла:

  • Как уже говорилось выше, в принципе, задача решена, поскольку при отсутствии фильтра по периоду рассчеты обоими способами идентичны;

  • При использовании механизма “Быстрые меры” в рассчетах присутствует некая дополнительная логика (при фильтрации периода в значение нарастающего итога берется то, что указано явным образом, то есть для значения “Январь” – “100”, а “Март” – “300”, сумма чего и составляет показанные в отчете “400”.

  • Ручная мера также стабильно показывает для значения “Март” нужные “600” даже при фильтрации периода, однако это неявное поведение, по сути фильтр здесь влияет только на количество столбцов визуального элемента;

  • Дополнительная логика, встроенная в механизм “Быстрые меры” иногда может быть не совсем понятна конечному пользователю, однако это не означает, что данная конструкция является неправильной / некорректной / и пр., просто она другая, и ее применение может быть действительно обосновано.

    Танки грязи не боятся,

    Ваш Смайл