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

6099

Зачастую хранение больших объёмов данных предполагает использование 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 записей.

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

Второй отчёт встраиваю ниже:

Оставить комметарий

ПОДЕЛИТЬСЯ
Всем привет. Меня зовут Альберт. Уже около 9 лет я успешно занимаюсь Business Intelligence, Data Minig, Data Science, OLAP, и т.д. На текущий момент являюсь Директором по внедрению в компании myBI. На портале Power BI Russia я веду рубрики "Кейсы" и "Руководства".