DAX
March 7, 2023

Тяжёлая доля. Как посчитать долю или процент от целого в PowerBI

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

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

Продажи категорий в рублях

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

Продажи категорий в виде гистограммы

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

Доли продаж категорий

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

Создание неявной меры для расчёта доли продаж

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

Посчитай процент(долю) продаж отдельной категории от продаж всех выбранных категорий с учетом всех фильтров.

Создадим визуализацию, где у нас будет три среза(фильтра) по году(Year), полу(Gender) покупателя и категории(Category)

Визуализация с неявной мерой

Создадим первую меру, с помощью функции ALL:

Именованная мера с функцией ALL

Добавляем меру в визуализацию:

Сравнение работы неявной и именованной меры без фильтров

Значения написанной нами меры и неявной меры - идентичны.

Установим фильтр по году - 2018:

Сравнение работы неявной и именованной меры с фильтром по году

Условие вопроса "с учетом всех фильтров" выполняется. Значения по прежнему одинаковые, а доли рассчитаны от итоговых продаж за 2018-й год.

Добавим фильтр по полу:

Сравнение работы неявной и именованной меры с фильтром по году и полу

Результат соответствует ожиданиям.

Но в вопросе ещё было "от продаж всех выбранных категорий". Давайте это и сделаем:

Сравнение работы неявной и именованной меры с фильтром по категориям

Значение написанной нами меры не соответствует ожиданиям. Это хорошо видно по строке итогов, где вместо 100% мы видим 58,91%. Это происходит потому, что функция ALL в соответствии со своим названием возвращает ВСЕ значения из указанного столбца, удалив ВСЕ фильтры, примененные к нему.

Попробуем воспользоваться функцией ALLEXCEPT:

Именованная мера с функцией ALLEXCEPT

Добавим новую меру в визуализацию:

Сравнение работы неявной и именованной меры c ALLEXCEPT

Почему теперь везде 100%? Для этого обратимся к определению функции ALLEXCEPT:

Возвращает все строки в таблице, за исключением тех строк, на которые влияют указанные фильтры столбцов

То есть, мы наоборот сбросили ВСЕ фильтры с таблицы Products, кроме столбца Category, так как каждая строка визуализации имеет свой контекст вычисления (подробнее о работе контекстов можно почитать здесь).

Что ж, воспользуемся третьей функцией из семейства ALL - ALLSELECTED:

Именованная мера с функцией ALLSELECTED

Сравним полученный результат:

Сравнение работы неявной и именованной меры c ALLSELECTED

Полученный результат идентичен значению неявной меры и полностью отвечает поставленному вопросу.

Но что если усложнить задачу и добавить ещё и месяцы в визуализацию?

Сначала визуализация с неявной мерой:

Матрица по месяцам с неявной мерой

На примере января видно, что расчёт доли идёт от "общего значения", то есть за весь год.

А как считает мера написанная самостоятельно:

Матрица по месяцам с именованной мерой

Итог по каждому месяцу равен 100%, то есть в такой визуализации именованная мера правильнее отвечает на поставленный вопрос, нежели неявная мера.

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

Ссылка на отчёт.