Сравнение версий
Ключ
- Эта строка добавлена.
- Эта строка удалена.
- Изменено форматирование.
Примечание |
---|
Перед просмотром примеров, изучите процедуру создания мер. |
Информация |
---|
Система проверяет вводимые DAX-формулы на наличие синтаксических ошибок. Неправильно написанные функции подчеркиваются волнистой красной линией, а при наведении курсора мыши на такую функцию появляется пояснительный текст. Это позволяет легко обнаруживать и исправлять ошибки. |
Пример 1. Расчет выручки в разбивке по магазинам и по продажам со скидками
Выручка считается по формуле:
Количество товара в заказе умножить на цену за единицу товара, минус скидка в заказе. Для построчного вычисления используемSUMX
:SUMX(factonlinesales, factonlinesales[unitprice]*factonlinesales[salesquantity] - factonlinesales[discountamount])
Для визуализации используем гистограмму. На нее выведем нашу меру в разбивке по магазинам:
Для того чтобы отобразить данные по продажам, по которым были акции, используем виджет фильтр:
Если есть необходимость рассчитать сразу продажи со скидками, без использования фильтра, будем использовать следующую формулу:
Блок кода CALCULATE(SUMX(factonlinesales, factonlinesales[unitprice]*factonlinesales[salesquantity] - factonlinesales[discountamount]), FILTER(dimpromotion,dimpromotion[promotioncategory] IN{"Store"}) )
Пример 2. Расчет доли продаж по продуктам внутри бренда
Сначала рассчитаем доли продаж по брендам.
Removefilters
в знаменателе отменяет все фильтры по измерению dimproduct, таким образом, доля считается корректно:Теперь добавим в разбивку продукт. Мера будет считать долю каждого продукта от общей суммы продаж:
Теперь мы посчитаем долю каждого продукта внутри бренда. Для этого мы сгруппируем продажи по бренду с помощью функции
SUMMARIZE
:
Выборка | ||
---|---|---|
| ||
Пример 3. Расчет средневзвешенной ценыДля расчета средневзвешенной цены необходимо выполнить следующие шаги:
|
Пример 3. Расчет итоговой прибыли с учетом типа клиента
Якорь | ||||
---|---|---|---|---|
|
Рассчитывать прибыль будем как для физических лиц, у которых имеется скидка, указанная в столбце discountamount, так и для юридических лиц, у которых также есть скидка, указанная в столбце bonus.
Используемые данные:
Таблица фактов | Таблица измерений |
---|---|
fact
| dimcustomer
|
Для расчета прибыли для физически лиц, создадим меру Прибыль для физ. лиц и введем следующую формулу:
Прибыль для физ . лиц = CALCULATE (SUMX (fact, fact[salesamount] - fact[discountamount]), FILTER (dimcustomer, dimcustomer[customertype] IN {"Person"} ))
где:
fact[discountamount]
– скидка, которая вычитается из общей суммы продажfact[salesamount]
;функция
FILTER
фильтрует измеренияdimcustomer
по значению столбцаcustomertype
, в данном случае равномуPerson
- т.е. фильтрует только физических лиц.
Таким образом, формула рассчитывает сумму прибыли для всех фактов, относящихся к физическим лицам.
Аналогичным образом создается мера Прибыль для юр. лиц с тем отличием, что вместо fact[discountamount]
мы будем использовать fact[bomus]
, а вместо IN {"Person"}
будем использовать IN {"Company"}
:
Прибыль для юр. лиц = CALCULATE (SUMX (fact, fact[salesamount] - fact[bonus]), FILTER (dimcustomer, dimcustomer[customertype] IN {"Company"} ))
В результате мы можем, например, создать следующую диаграмму с использованием созданных мер:
При сложении двух формул, мы получим прибыль с учетом типа клиента:
Блок кода |
---|
CALCULATE ( SUMX (fact, fact[salesamount] - fact[discountamount]), FILTER (dimcustomer, dimcustomer[customertype] IN {"Person"} ) ) + CALCULATE ( SUMX (fact, fact[salesamount] - fact[bonus]), FILTER (dimcustomer, dimcustomer[customertype] IN {"Company"} ) ) |
Пример 4. Расчет суммы продаж за указанный период (несколько месяцев)
Якорь | ||||
---|---|---|---|---|
|
В этом примере мы попробуем понять, сколько выручки приносит “целевой“ период.
Используемые данные:
Таблица фактов | Таблица измерений |
---|---|
fact
| dimdate
|
Для получения необходимых расчетов мы будем использовать следующие формулы:
Расчет количества продаж за указанный период:
Блок кода |
---|
CALCULATE ( COUNT (fact[onlinesaleskey]), FILTER ( dimdate, AND (dimdate[calendarmonth] >= 202207, dimdate[calendarmonth] < 202209) ) ) |
где:
COUNT (fact[onlinesaleskey])
– подсчитывает количество транзакций в столбце onlinesaleskey
таблицы фактов fact
.
FILTER
– фильтрует таблицу dimdate
по определенному условию, которое состоит из двух частей:
dimdate[calendarmonth] >= 202207
- выбираются только те строки таблицыdimdate
, у которых значение в столбцеcalendarmonth
больше или равно202207
(июль 2022 года);dimdate[calendarmonth] < 202209
- выбираются только те строки, у которых значение в столбцеcalendarmonth
меньше202209
(сентябрь 2022 года).
Таким образом, фильтр выбирает только те строки из таблицы, которые соответствуют периоду с июля по сентябрь 2022 года.
Расчет суммы продаж за указанный период:
Аналогичным образом мы проведем расчет суммы продаж (с небольшими изменениями):
Блок кода |
---|
CALCULATE ( SUM (fact[salesamount]), FILTER ( dimdate, AND (dimdate[calendarmonth] >= 202207, dimdate[calendarmonth] < 202209) ) ) |
где:
SUM (fact[salesamount])
– вычисляет сумму значений из столбца salesamount
таблицы fact
.
FILTER
– как показано в примере выше, выбирает только те строки из таблицы, которые соответствуют периоду с июля по сентябрь 2022 года.
В результате выполнения этой формулы будет получена сумма продаж за определенный период времени (с июля по сентябрь 2022 года).
В качестве итога, используя созданные меры, мы может визуализировать полученные результаты следующим образом:
Пример 5. Расчет динамики продаж за определенный период
Якорь | ||||
---|---|---|---|---|
|
В данном примере мы рассчитаем динамику продаж за два месяца и за два календарных года, чтобы понять какие товары не приносят прибыли и исключить их из ассортимента.
Используемые данные:
Таблица фактов | Таблица измерений |
---|---|
fact
| dimdate
|
Расчет динамики продаж по месяцам
Для расчета динамики продаж за два месяца (в нашем примере август-сентябрь), мы сделаем следующее:
Сперва мы рассчитаем объем продаж за август. Для этого мы создадим меру с использованием следующей формулы:
Блок кода CALCULATE ( SUM (fact[salesamount]), FILTER (dimdate, dimdate[calendarmonth] = 202208) )
где:
SUM (fact[salesamount])
– вычисляет сумму значений из столбцаsalesamount
таблицыfact
;FILTER
– выбираются только те строки таблицыdimdate
, у которых значение в столбцеcalendarmonth
равно202208
(август 2022 года);Далее рассчитаем объем продаж за сентябрь. Для этого мы будем использовать аналогичную формулу, в которой заменим лишь номер месяца (август):
Блок кода CALCULATE ( SUM (fact[salesamount]), FILTER (dimdate, dimdate[calendarmonth] = 202209) )
где
202209
– сентябрь 2022 года.Теперь самое время получить разницу между двумя этими результатами, чтобы определить динамику продаж. Для этого мы вычтем значения, полученные за август из значений, полученных за сентябрь:
Блок кода CALCULATE ( SUM (fact[salesamount]), FILTER (dimdate, dimdate[calendarmonth] = 202209) ) - CALCULATE ( SUM (fact[salesamount]), FILTER (dimdate, dimdate[calendarmonth] = 202208) )
Результат можно визуализировать, например, с помощью таблицы или диаграммы:
Расчет динамики продаж по годам
Динамика продаж по годам рассчитывается аналогичным образом – нам необходимо только заменить месяцы на года и использовать соответствующий столбец (calendaryear), где прописаны года:
Блок кода |
---|
CALCULATE ( SUM (fact[salesamount]), FILTER (dimdate, dimdate[calendaryear] = 2022) ) - CALCULATE ( SUM (fact[salesamount]), FILTER (dimdate, dimdate[calendaryear] = 2021) ) |
где
FILTER (dimdate, dimdate[calendaryear] = 2022)
и FILTER (dimdate, dimdate[calendaryear] = 2021)
фильтруют данные по годам.
Созданную меру можно добавить в таблицу для полноты картины:
Чтобы иметь быстрый доступ к полученной статистике, можно создать дашборд:
Пример 6. Расчет прибыли по каждой продаже за месяц с учетом дополнительных платежей
Якорь | ||||
---|---|---|---|---|
|
Рассмотрим пример, в котором прибыль рассчитывается по каждой продаже с учетом различных платежей (например, за аренду помещений). Дополнительные платежи оплачиваются в разное время и не являются заказами. Рассматриваемый период - сентябрь 2022 года.
Используемые данные:
Таблица фактов | Таблица измерений |
---|---|
fact
| dimdate
|
Для проведения расчетов мы воспользуемся следующей формулой:
Блок кода |
---|
CALCULATE ( SUMX (fact, fact[salesamount] - fact[discountamount]), FILTER (fact, fact[transactiontype] IN {“order”}) ) - CALCULATE ( SUM (fact[payment]), REMOVEFILTERS (fact), FILTER (fact, fact[transactiontype] IN {“payment”}), FILTER (dimdate, dimdate[calendarmonth] = 202209) ) / CALCULATE ( COUNT (fact[onlinesaleskey]), REMOVEFILTERS (fact), FILTER (fact, fact[transactiontype] IN {“order”}), FILTER (dimdate, dimdate[calendarmonth] = 202209) ) |
Первая часть формулы суммирует выручку от каждой продажи:
SUMX (fact, fact[salesamount]SUMX (fact, fact[salesamount]
и вычитает сумму скидки:
- fact[discountamount])
Далее применяется фильтр, чтобы учитывать только транзакции типа “order
" в столбце transactiontype
таблицы fact
.
Вторая и третья части рассчитывают дополнительные платежи по каждому заказу:
Во второй части формулы используется CALCULATE-функция, которая вычисляет сумму всех платежей за сентябрь 2022 года, относящихся к продажам за этот же период. Функция REMOVEFILTERS
используется для того, чтобы убрать все фильтры из таблицы fact
. Функция FILTER
добавляет фильтры по типу транзакции и месяцу календаря.
В третьей части CALCULATE-функция подсчитывает количество продаж онлайн за сентябрь 2022 года. Функция REMOVEFILTERS
убирает все фильтры из таблицы "fact
", функция и FILTER
добавляет фильтры по типу транзакции и месяцу календаря.
Дополнительные платежи вычитаются из выручки, и мы получаем прибыль по каждой продаже с учетом дополнительных расходов за сентябрь 2022 года:
Пример 7. Расчет суммы накопленного итога
Якорь | ||||
---|---|---|---|---|
|
В данном примере мы рассчитаем накопленный итог продаж за определенный период времени. Для расчетов мы будем использовать формулу, которая позволяет посчитать накопленный итог со сбросом по годам. С помощью такой формулы можно выполнить любое разбиение визуализируемых данных – по дням, неделям, месяцам, кварталам и полугодиям.
Используемые данные
Таблица фактов | Таблица измерений |
---|---|
facts
| dimdate
|
Для проведения расчетов, воспользуемся следующей формулой:
Блок кода |
---|
CALCULATE ( SUM ( 'facts'[salesamount] ), FILTER ( ALL ( 'dimdate' ), AND( 'dimdate'[datekey] >= DATE ( YEAR(MAX('dimdate'[datekey])), 1, 1 ), 'dimdate'[datekey] <= MAXX ( 'dimdate', 'dimdate'[datekey] )) ) ) |
Данная формула легла в основу новой меры – Накопленный итог,и с ее помощью мы визуализировали накопленный итог со сбросом по годам:
На изображении видно, что начиная с первого месяцам 2009 года накопление сбрасывается и происходит дальнейший накопительный расчет.
Накопленный итог без сброса по годам пока не работает.
Примечание |
---|
Данная формула функционирует в бета-режиме. Рекомендуется тестирование на небольшом объеме данных. |
панель | ||||||
---|---|---|---|---|---|---|
| ||||||
Ограничения, касающиеся данной формулы:
|
Пример 8. Вычисление средней цены товара для каждого чека
Якорь | ||||
---|---|---|---|---|
|
В данном примере мы вычислим среднюю цену товара для каждого чека, используя данные о ценах и номерах заказов из таблицы factonlinesales
.
Используемые данные:
Таблица фактов |
---|
factonlinesales
|
Для вычислений мы воспользуемся следующей формулой:
Блок кода |
---|
Средняя цена товара по чеку = DIVIDE( CALCULATE( SUM('factonlinesales'[unitprice]), REMOVEFILTERS('factonlinesales'), SUMMARIZE('factonlinesales', 'factonlinesales'[salesordernumber]) ), CALCULATE( COUNT('factonlinesales'[productkey]), REMOVEFILTERS('factonlinesales'), SUMMARIZE('factonlinesales', 'factonlinesales'[salesordernumber]) ), BLANK() ) |
Данная формула состоит из нескольких шагов:
Вычисляется сумма цен всех товаров в чеках без учета фильтров (
REMOVEFILTERS
). Для этого сначала применяется функцияCALCULATE
, которая вычисляет сумму цен всех товаров по каждому уникальному номеру заказа (salesordernumber
) из таблицыfactonlinesales
, затем функцияREMOVEFILTERS
удаляет фильтры, которые могут изменить сумму цен, и возвращает данные без фильтров.Вычисляется количество товаров в каждом чеке без учета фильтров. Для этого также используется функция
CALCULATE
с аналогичными параметрами.Вычисляется средняя цена товара по каждому чеку с помощью функции
DIVIDE
. Результат первого шага делится на результат второго шага, чтобы получить среднюю цену товара по каждому чеку.Результат деления на ноль заменяется на пустую строку (
BLANK()
).
Примечание |
---|
Если в заказе несколько строк для одного и того же товара (разные цены, например, по скидке и без), то формула может не работать, как ожидается. Это связано с тем, что для одного и того же товара несколько позиций, в результате итоговое количество товаров считается неверно. |
Пример 9. Расчет среднего чека
Якорь | ||||
---|---|---|---|---|
|
В данном примере мы рассчитаем сумму среднего чека. Средний чек показывает, сколько готовы тратить клиенты или покупатели. По его сумме делают выводы о лояльности покупателей, их покупательской способности, эффективности маркетинга. Чтобы увеличить средний чек, магазины придумывают акции, сужают или расширяют ассортимент, меняют способы оплаты, раздают промокоды и т.д.
Используемые данные:
Таблица фактов |
---|
факты онлайн продаж
|
Для вычислений мы воспользуемся следующей формулой:
Блок кода |
---|
Средний чек = DIVIDE ( CALCULATE ( SUMX ( 'факты онлайн продаж', 'факты онлайн продаж'[unitprice] * 'факты онлайн продаж'[salesquantity] ), REMOVEFILTERS ( 'факты онлайн продаж' ), SUMMARIZE ( 'факты онлайн продаж', 'факты онлайн продаж'[salesordernumber] ) ), CALCULATE ( DISTINCTCOUNT ( 'факты онлайн продаж'[salesordernumber] ), REMOVEFILTERS ( 'факты онлайн продаж' ), SUMMARIZE ( 'факты онлайн продаж', 'факты онлайн продаж'[salesordernumber] ) ) |
Данная формула сначала вычисляет сумму произведений цены за единицу товара (unitprice
) и количества проданных единиц (salesquantity
) для всех строк таблицы факты онлайн продаж
. Затем она удаляет фильтры (если они есть), примененные к таблице, и суммирует количество номеров заказов (salesordernumber
).
После этого происходит деление на результат второго CALCULATE
, который считает количество уникальных номеров заказов (с помощью DISTINCTCOUNT
), исключая фильтры, и также суммирует номера заказов. Это и дает среднюю цену проданных товаров.
Пример 10. Расчет меры по условию с проверкой на уровне строк и учетом коэффициента
Якорь | ||||
---|---|---|---|---|
|
С помощью DAX-формул вы можете вычислять числовую меру, учитывая определённый коэффициент и проверяя выполнение конкретного условия для каждой строки данных. Возможность учёта различных условий и коэффициентов позволяет получить более точные и полезные результаты для анализа данных. Ниже приведено несколько формул, которые позволяют выполнять эти задачи.
Используемые данные:
Таблица фактов |
---|
факты онлайн продаж
|
Формула 1
Формула ниже суммирует значения в столбце salesamount
таблицы факты онлайн продаж, но с одним условием: если значение идентификатора продукта (productkey
) равно 6
, то значение salesamount
умножается на 0.8 (что даёт 80% от исходного значения). Если условие не выполняется, то используется исходное значение salesamount
. Это повторяется для каждой строки в таблице факты онлайн продаж
.
Таким образом, формула дает суммарное значение продаж, но продажи для продукта с идентификатором 6
учитываются с коэффициентом 0.8
.
Блок кода |
---|
Объем продаж с коэффициентом = sumx ( 'факты онлайн продаж', if ( 'факты онлайн продаж'[productkey]= 6, 'факты онлайн продаж'[salesamount]* 0.8, 'факты онлайн продаж'[salesamount] ) ) |
Формула 2
Формула, приведенная ниже, суммирует значения столбца salesamount
, но только для тех строк, где значение идентификатора продукта отлично от 6
. Если условие не выполняется (т.е. если идентификатором продукта является 6
), то вместо значения salesamount
используется 0
. Результатом является сумма значений из столбца salesamount
для всех строк, где productkey
отличен от 6
. Если в строке productkey
равен 6
, то значение salesamount
в сумму не включается.
Блок кода |
---|
Объем продаж без учета отдельного товара = sumx( 'факты онлайн продаж', if ( 'факты онлайн продаж'[productkey] <> 6, 'факты онлайн продаж'[salesamount], 0 ) ) |
Смотрите также
На этой странице
Пример 1. Расчет выручки в разбивке по магазинам и по продажам со скидками
Пример 4. Расчет суммы продаж за указанный период (несколько месяцев)
Пример 6. Расчет прибыли по каждой продаже за месяц с учетом дополнительных платежей
Пример 10. Расчет меры по условию с проверкой на уровне строк и учетом коэффициента
🕑 Время чтения: 4 мин.
Нужна дополнительная помощь?