Превращаем громоздкие отчёты в эффективные и компактные.

13559
feautered2

Зачастую хранение больших объёмов данных предполагает использование OLAP технологий. Это может касаться как внутри-корпоративных хранилищ данных, так и внешних сервисов, к примеру веб-аналитики.

Использование подобных источников при создании отчётности в Power BI приводит к тому, что на входе мы получаем выгруженные данные в табличном виде. И, как правило, эти выгрузки имеют формат сводных таблиц.

На практике это выглядит следующим образом:

Данные, которые я выгрузил из Яндекс.Метрики сведены по полю “Дата визита”, меры при этом находятся в полях (столбцах). Конечно, такой вид представления очень удобен для визуального чтения информации.

Теперь предположим, что нам необходимо создать отчётность на подобной выгрузке из Яндекс.Метрики.

Для этого возьмём XLS файл в качестве источника и создадим отчёт “в лоб”.

Я вынужден использовать отдельные визуализации-диаграммы для каждой из мер. 5 мер – 5 диаграмм, 100 мер – 100 диаграмм. Это серьезно снижает “читабельность” отчётности.

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

Было бы здорово иметь одну визуализацию-диаграмму, на которой можно на выбор выводить различные метрики (меры). Реализовать такую задумку на текущей таблице напрямую нельзя.

К счастью, у нас есть два варианта решения задачи. Хорошие новости в том, что нет необходимости предобрабатывать источник до загрузки в модель. Все необходимые преобразования мы будем прямо в Power BI.

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

Вариант 1

Данный способ подойдёт новичкам, не знакомым с выражениями DAX

Для реализации отчёта первым способом нам необходимо изменить запросы. Идём в редактор запросов.

Выбираем наш источник – таблицу. После этого выделяем мышкой столбцы, в которых расположены интересующие нас меры. Кликаем правой кнопкой мыши на заголовок любого из выделенных столбцов и выбираем в контекстном меню – “Отменить свёртывание столбцов”.

MenuUnPivot

Получим новую таблицу в таком виде:

Table_Unpivot

После этого необходимо у поля “Значение” сменить тип данных на Десятичное число.

Теперь у нас есть поле с названием наших мер и поле со значениями этих самых мер.

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

Получим короткую таблицу.

Metrics_List

Следующим действием установим связь справочника и нашей развёрнутой таблицы. Создадим однонаправленную связь “Многие к 1”.

Connection

ConnectionDialog

В конструкторе отчётов создадим срез из нашего справочника мер и сделаем одну диаграмму на основе развёрнутой таблицы. В оси поставим Дату визита. В условные обозначения – Метрику, а в значения – Значения мер.

ChartProperties

ChartSlice

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

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

PivotUnPivot

Вариант 2

Данный способ лично мне кажется проще и красивее.

Для этого нам НЕ потребуется преобразовывать исходную таблицу в новую.

Достаточно создать справочник мер, как и в первом способе

Metrics_List

После чего в исходной таблице необходимо добавить новую вычисляемую меру:

NewMesaure

Значение меры =
IF (
    HASONEVALUE ( 'Метрики'[Метрика] );
    SWITCH (
        VALUES ( 'Метрики'[Метрика] );
        "Визиты"MIN ( 'Отчет'[Визиты] );
        "Посетители"MIN ( 'Отчет'[Посетители] );
        "Просмотры"MIN ( 'Отчет'[Просмотры] );
        "Доля новых посетителей"MIN ( 'Отчет'[Доля новых посетителей] );
        "Отказы"MIN ( 'Отчет'[Отказы] );
        "Глубина просмотра"MIN ( 'Отчет'[Глубина просмотра] );
        "Время на сайте"MIN ( 'Отчет'[Время на сайте] )
    );
    BLANK ()
)

Она работает следующим образом:

Проверяет, если в нашем срезе выбрано только одно значение, то на основании этого значения возвращается определённая мера. Для “сырых” (фактов) мер необходимо использовать статистическое выражение MIN, MAX, AVERAGE и т.д. В случае, если мы уже используем вычисляемую меру, то статистическое выражение не потребуется.

Теперь нам необходимо добавить срез на основании справочника метрик и создать диаграмму со следующими параметрами:

Case2chart

В целом, визуально у нас получится решение, абсолютно идентичное первому способу.

Но у данного варианта есть ряд преимуществ:

1. Всё делается в рамках одной таблицы.
2. Реализация происходит значительно быстрее.
3. На больших объёмах данных производительность не будет падать, в отличие от первого способа.

Подробнее остановлюсь на последнем пункте.

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

К примеру, если у нас 1.000.000 записей в исходной сведённой таблице, то при использовании 20 мер, которые мы развернём в одном столбце, на выходе получим таблицу, у которой будет уже 20.000.000 записей.

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

Всем привет. Меня зовут Бикаев Альберт. Уже более 13 лет я успешно занимаюсь Business Intelligence, Data Minig, Data Science, OLAP, и т.д. Являюсь основателем магазина кастомных визуализаций для Power BI, а также исполнительным директором компании myBI.