Visualisations
February 7, 2022

Как показать меры в строках матрицы?

В заголовок я вынес достаточно простой вопрос, решение которого доступно в базовом функционале визуализации, но тем не менее вызывает затруднение у новичков - тех, кто только начинает работать в #PowerBI.

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

Но обо всём по порядку.

Стандартный функционал

В модели данных созданы три меры:

Базовая мера объёма продаж
Мера объёма продаж за предыдущий месяц
Мера сравнения объёма продаж текущего и предыдущего месяца

Теперь создадим визуальный элемент матрица, в который добавим названия категорий товаров, месяца и три меры, которые создали.

Стандартная матрица

Получилась очень длинная таблица с множеством цифр, которые сливаются друг с другом без форматирования. Хорошо что мера [% Compare] отображается в виде процентов, позволяя отделить месяца друг от друга.

Давайте поместим меры в строки и посмотрим, что получится. Для этого перейдём в свойства визуального элемента - вкладка Формат(в виде валика) - раздел Значения - и включим переключатель Отображать в строках

Отобразить меры в строках

Всё, вот так просто.

На скриншотах я использую старую панель визуализации, так как новая находится пока в предварительной версии и не все функции могут корректно работать, а не которые даже отсутствовать.

Только вот есть одно НО: Категории нельзя свернуть - всегда отображаются все меры. И, если вы хотели бы сконцентрироваться на одной категории, то придётся фильтровать - свернуть остальные не получится. Поэтому переходим к расширенным решениям.

Создаём единую меру

У меня есть статья о переключении мер в визуализациях. Здесь будет использоваться тот же принцип.

Для начала создадим вспомогательную таблицу, которая будет содержать названия мер и номер для их сортировки в визуализации в нужном порядке.

Вспомогательная таблица для использования мер

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

Единая мера
Эту меру можно было бы написать множеством способов - тут отчасти дело эстетического вкуса: можно вместо SELECTEDVALUE использовать функцию MIN, так как обращаемся к номеру меры, а можно проверять и имя меры, чтобы потом не гадать, что такое 1,2,3. И так далее.

Создадим новую матрицу, добавив в строки столбец с названиями мер из вспомогательной таблицы, а в значения только что созданную меру:

Матрица на основе вспомогательной таблицы и единой меры

Почему матрица пустая? Потому что на уровне категории в контексте оказываются все три строки, из-за чего функция SELECTEDVALUE возвращает пустое значение, что в свою очередь приводит к последнему аргументу функции SWITCH. Если же развернуть матрицу до следующего уровня - строк вспомогательной таблицы, то мера будет работать:

Значения единой меры на уровне строк вспомогательной таблицы

Как видите, теперь мы можем сворачивать отдельные категории. Но, чтобы не пугать пользователей "внезапным исчезновением" свёрнутой категории немного изменим нашу меру, добавив второй аргумент в функции SELECTEDVALUE.

Модифицированная единая мера
Значения единой меры на уровне строк вспомогательной таблицы и категорий

На уровне категорий теперь всегда возвращается значение нашей базовой меры [Sum Orders Qty]. Того же самого можно было бы добиться, используя MIN вместо SELECTEDVALUE.

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

Пойдём на небольшую хитрость и модифицируем меру, добавив в неё форматирование с помощью функции FORMAT

Единая мера с форматированием

Больше об использовании форматов можно прочитать в моей статье Пользовательский формат данных

Матрица и единая мера с форматированием

Теперь каждая строка с мерой имеет соответствующий формат, но появилась новая проблема - почему-то отображается категория Components, хотя все её значения пустые. На самом деле, использовав функцию FORMAT, мы превратили все наши значения в текст, в том числе и пустые.

Как говорится в старой шутке:

- Видишь суслика?

-Нет.

- И я нет, а он есть.

Чтобы избавиться от "пустых" строк придётся вновь изменить меру, добавив проверку:

Единая мера с проверкой на пустое значение
Матрица и единая мера с форматированием и проверкой

Таким образом, мы можем сворачивать и разворачивать категории, показывать и сортировать меры в нужном нам порядке. Внутри SWITCH можно настраивать и более сложные условия для отображения мер. Например, можно проверять название категории и для каждой из них показывать свой набор мер.

Бонусом, как я и говорил, можно названия мер поместить не в строки, а в столбцы, разместив их над другими измерениями:

Матрица с мерами в столбцах над измерением

Главным недостатком такой меры будет то, что её можно использовать ТОЛЬКО в матрице, таблице или карточке, так как она возвращает текст, а диаграммы не могут в значениях содержать текст - только числа. Поэтому более продвинутым решением, но похожим на единую меру будет создание Calculation group.

Работаем с Calculation group

Для создания Calculation group(CG) понадобится Tabular editor (версии 2 будет достаточно - она бесплатна, версия 3 более продвинутая, но платная).

Итак, создаём CG и добавляем в неё три Calculation item, которые соответствуют трём мерам.

Базовая мера [Sum Orders Qty]

Calculation item Sum Orders Qty

В качестве Expression для Calculation item Sum Orders Qty будем использовать функцию SELECTEDMEASURE, которая возвращает значение меры находящейся в визуализации. А строку форматирования Format String Expression оставим пустой, соответственно формат будет браться из форматирования меры.

Мера [Sum Orders Qty LM]

Calculation item Sum Orders Qty LM

В качестве Expression для Calculation item Sum Orders Qty LM я использовал функцию, хотя мог бы сослаться на уже существующую меру [Sum Order Qty LM] и тогда оставить строку форматирования пустой, используя форматирование из меры, но могу и изменить формат, задав его в виде текстовой строки.

Мера [% Compare]

Calculation item % Compare

Здесь я вновь создаю функцию в Expression, но уже ссылаясь внутри неё на существующие меры. А раз создаём функцию, то необходимо задать форматирование.

Матрица с CG

Добавляем в строки столбец Name из нашей CG, а в значения нашу базовую меру. Как видим, по умолчанию, т.к. нет контекста или фильтра по calculation items возвращается значение базовой меры [Sum Orders Qty], в отличии единой меры, когда у нас всё исчезло.

Если же развернуть любую категорию, то каждая мера будет отформатирована согласно значению в Format String Expression.

Сравнение матриц со SWITCH и CG

Только вот в отличии от единой меры, если развернута хотя бы одна категория, для остальных свернутых значение становится пустым. Но, я уверен, вы сами сможете придумать, как обработать эту "ошибку"))

Итак, вы увидели три разных подхода к решению одной задачи. Каждое решение имеет свои плюсы и минусы. И то, какое из них использовать, решать только вам, исходя из потребностей и стоящих задач.

Как всегда файл с примером можно найти по ссылке, а в комментариях можно задавать вопросы.