Перейти к содержанию
Educora
Средний20 мин5 / 10

DAX: меры, вычисляемые столбцы и контекст

Изучи на небольшом наборе продаж разницу между вычисляемым столбцом и мерой, контекст строки и фильтра, функции SUM, AVERAGE, COUNTROWS, DISTINCTCOUNT, переменные VAR/RETURN и безопасное деление через DIVIDE.

Проверь себя
В этом уроке ты узнаешь
  • Выбирать, когда нужен вычисляемый столбец, а когда мера
  • Объяснять контекст строки и контекст фильтра
  • Писать основные агрегирующие меры и заранее вычислять их результат
  • Писать понятные и безопасные формулы с VAR/RETURN и DIVIDE

Эльвину нужно показать руководителю три числа: общие продажи, средний чек и число клиентов — по всей компании и отдельно по каждому городу и месяцу. В Excel для этого понадобились бы десятки формул. В Power BI мера, один раз написанная на языке DAX (Data Analysis Expressions), сама пересчитывается под любой фильтр, выбранный в визуальном элементе.

#CityProductCustomerIDQuantityUnitPriceAmount
1BakuHeadphonesC1260120
2GanjaNotebookC210550
3BakuKeyboardC114545
4SumgaitBackpackC3340120
5BakuNotebookC4205100
6GanjaHeadphonesC116060
7BakuBackpackC124080
8SumgaitKeyboardC324590
Таблица Sales (январь–март 2026). Клиенты: C1 — Айсель, C2 — Мурад, C3 — Лейла, C4 — Эльвин. Amount — вычисляемый столбец.

Вычисляемый столбец и мера

Вычисляемый столбец: для каждой строки, считается при обновлении и хранится
// Table tools › New column
Amount = Sales[Quantity] * Sales[UnitPrice]
Мера: вычисляется на лету по фильтрам визуального элемента, не хранится
// Home › New measure
Total Sales = SUM ( Sales[Amount] )

Обе формулы смотрят на одну таблицу, но работают в разное время. Столбец Amount вычисляется один раз для каждой из 8 строк при обновлении и хранится в модели. Мера Total Sales нигде не хранится: она пересчитывается при открытии визуального элемента, при смене среза или выделении в другом визуальном элементе. В области Data у мер значок калькулятора, а вычисляемые столбцы выглядят как обычные столбцы.

СвойствоВычисляемый столбецMeasure
Когда вычисляетсяодин раз, при обновлениипри каждой отрисовке визуального элемента
Памятьзанимает место в моделиместа не занимает
Контекстконтекст строкиконтекст фильтра
Где используетсясрезы, оси, заголовки строк и столбцовValues: числа, проценты, KPI
Простое правило: если по результату нужно фильтровать или группировать — столбец; если нужно агрегировать и сравнивать — мера.

Контекст строки и контекст фильтра

Определение
Контекст строки

Знание формулы о том, «на какой строке я сейчас». В вычисляемом столбце Power BI проходит таблицу построчно: в строке 1 Sales[Quantity] равно 2, Sales[UnitPrice] — 60, поэтому Amount = 120.

Определение
Контекст фильтра

Совокупность всех фильтров, наложенных на модель перед вычислением меры: заголовки строк и столбцов визуального элемента, срезы, область Filters, перекрёстное выделение. В строке «Baku» мера Total Sales видит только 4 строки Баку: 120 + 45 + 100 + 80 = 345.

Основные агрегирующие меры

DAX
Total Sales = SUM ( Sales[Amount] )
Orders = COUNTROWS ( Sales )
Avg Order = AVERAGE ( Sales[Amount] )
Customers = DISTINCTCOUNT ( Sales[CustomerID] )
Units = SUM ( Sales[Quantity] )
Каждая строка — отдельная мера (Home › New measure). COUNTROWS считает строки таблицы, а DISTINCTCOUNT — различные значения в столбце.
CityTotal SalesOrdersAvg OrderCustomersUnits
Baku345486,25225
Ganja110255211
Sumgait210210515
Итого665883,125441
Матрица по Store[City]. Обрати внимание: в Customers 2 + 2 + 1 = 5, а итог равен 4 — Айсель (C1) покупала и в Баку, и в Гяндже, а итоговая строка считает её один раз.

Переменные (VAR/RETURN) и DIVIDE

DAX
Sales per Customer =
VAR SalesAmt = [Total Sales]
VAR Cust = [Customers]
RETURN
    DIVIDE ( SalesAmt, Cust )
VAR даёт имя промежуточному результату, а RETURN возвращает итоговое выражение. Переменная вычисляется один раз, и формула становится понятной.
CityTotal SalesCustomersSales per Customer
Baku3452172,5
Ganja110255
Sumgait2101210
Итого6654166,25
345 / 2 = 172,5; 110 / 2 = 55; 210 / 1 = 210; в итоге 665 / 4 = 166,25 ₼.

Почему DIVIDE, а не /? Когда знаменатель равен 0 или пуст (BLANK), / может вернуть ошибку или бесконечность, а DIVIDE возвращает пустое значение, и визуальный элемент остаётся чистым. Третий аргумент задаёт альтернативный результат: DIVIDE ( [Total Sales], [Customers], 0 ). Например, у нового филиала без продаж Sales per Customer будет пустым, а не ошибкой.

Пример: категория Electronics

В срезе выбрано Category = «Electronics». Что покажут меры Total Sales, Orders, Avg Order, Customers и Sales per Customer? Сначала посчитай на бумаге, затем проверь визуальным элементом.

Показать решение
1) Контекст фильтра: строки Headphones и Keyboard — строки 1, 3, 6 и 8.
2) Total Sales = 120 + 45 + 60 + 90 = 315 ₼; Orders = 4.
3) Avg Order = 315 / 4 = 78,75 ₼.
4) Customers: C1, C1, C1, C3 → различные значения C1 и C3 = 2.
5) Sales per Customer = DIVIDE(315, 2) = 157,5 ₼.
Ни одну меру мы не меняли — изменился только контекст фильтра.
Новая строка ниже в строке формул DAXShift+Enter
Подтвердить формулуCtrl+Enter
Показать подсказки (IntelliSense)Ctrl+Space
Закомментировать или раскомментировать строкуCtrl+/
Развернуть или свернуть строку формул DAXCtrl+J

Главное

  • Вычисляемый столбец работает в контексте строки и хранится; мера вычисляется на лету в контексте фильтра.
  • Контекст фильтра создают заголовки визуального элемента, срезы, область фильтров и перекрёстное выделение.
  • DISTINCTCOUNT и AVERAGE не аддитивны: итоговая строка пересчитывается.
  • Пиши явные меры вместо неявных.
  • VAR/RETURN упрощает формулы, DIVIDE при делении на ноль возвращает пустое значение.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Нужно разбить товары на группы «Дешёвые / Дорогие» и показать это в срезе. Что создать?