Menu
CoddyTech

Шпаргалка по Power BI

Последнее обновление

Изучайте Power BI бесплатно

Меры, столбцы и таблицы

Мера вычисляется для каждой ячейки визуального элемента; вычисляемый столбец вычисляется один раз для каждой строки и хранится в модели.

Что делаетDAX
Создать меруTotal Sales = SUM ( Sales[Amount] )
Создать вычисляемый столбец (одно значение на строку)Line Total = Sales[Quantity] * Sales[Unit Price]
Создать вычисляемую таблицуTop Customers = TOPN ( 10, Customer, [Total Sales] )
Сослаться на столбец: имя таблицы, затем столбец в квадратных скобкахSales[Amount]
Взять в кавычки имя таблицы, в котором есть пробел или которое является зарезервированным словом'Date'[Date]
Сослаться на меру: только квадратные скобки[Total Sales]
Использовать меру внутри другой мерыAverage Price = DIVIDE ( [Total Sales], [Total Units] )

Функции агрегации

Каждая из них сводит столбец в текущем контексте фильтра.

Что делаетDAX
Сложить значения столбцаSUM ( Sales[Amount] )
Среднее по столбцуAVERAGE ( Sales[Amount] )
Наименьшее значениеMIN ( Sales[Order Date] )
Наибольшее значениеMAX ( Sales[Order Date] )
Посчитать строки таблицыCOUNTROWS ( Sales )
Посчитать непустые значения столбцаCOUNT ( Sales[Amount] )
Посчитать уникальные значенияDISTINCTCOUNT ( Sales[Customer Key] )
Безопасное деление: пустое значение вместо ошибки, когда знаменатель равен 0DIVIDE ( [Total Sales], [Total Units] )
Деление со значением, которое показывается, когда знаменатель равен 0DIVIDE ( [Profit], [Total Sales], 0 )

Итераторы (функции X)

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

Что делаетDAX
Умножить в каждой строке, затем сложитьSUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Среднее от результата по каждой строкеAVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Наибольший результат по строкамMAXX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Среднее значение меры по клиентамAVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] )
Использовать в выражении столбец связанной таблицыSUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) )
Посчитать строки, которые проходят условиеCOUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) )
Ранжировать каждый продукт по мереRANKX ( ALL ( Product[Product] ), [Total Sales] )
Ранг без пропусков после равных значений (1, 1, 2)RANKX ( ALL ( Product[Product] ), [Total Sales], , DESC, DENSE )
Объединить значения в один текстCONCATENATEX ( VALUES ( Product[Category] ), Product[Category], ", " )

CALCULATE и функции фильтров

CALCULATE вычисляет выражение с изменёнными фильтрами. Фильтр на тот же столбец заменяет старый; фильтры на разные столбцы объединяются через AND.

Что делаетDAX
Фильтр по одному значениюCALCULATE ( [Total Sales], Product[Category] = "Bikes" )
Фильтр по списку значенийCALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } )
Два фильтра (AND)CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" )
OR по двум столбцамCALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) )
Фильтр по мереCALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Сохранить текущий фильтр и пересечь с нимCALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) )
Снять фильтры со столбцаCALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) )
Снять все фильтры с таблицыCALCULATE ( [Total Sales], ALL ( Product ) )
Снять все фильтры с таблицы, кроме некоторых столбцовCALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) )
Сохранить выбор в срезах, но убрать строки самого визуального элементаCALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) )
Использовать неактивную связьCALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) )
Пропустить фильтр в обе стороны для одной мерыCALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) )
Фильтр по таблице, с которой нет связиCALCULATE ( [Total Sales], TREATAS ( VALUES ( Budget[Category] ), Product[Category] ) )

Логика операций со временем

Для этих функций нужна таблица дат: одна строка на каждый день, без пропусков, отмеченная как таблица дат.

Что делаетDAX
С начала годаTOTALYTD ( [Total Sales], 'Date'[Date] )
С начала года, финансовый год заканчивается 30 июняTOTALYTD ( [Total Sales], 'Date'[Date], "6/30" )
С начала года внутри CALCULATECALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) )
С начала кварталаTOTALQTD ( [Total Sales], 'Date'[Date] )
С начала месяцаTOTALMTD ( [Total Sales], 'Date'[Date] )
Тот же период прошлого годаCALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
Сдвинуть даты на интервал (здесь на месяц назад)CALCULATE ( [Total Sales], DATEADD ( 'Date'[Date], -1, MONTH ) )
Весь предыдущий месяцCALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) )
Весь период год назадCALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) )
Последние 12 месяцев до последней видимой датыCALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) )
Фиксированный диапазон датCALCULATE ( [Total Sales], DATESBETWEEN ( 'Date'[Date], DATE ( 2025, 1, 1 ), DATE ( 2025, 3, 31 ) ) )

Частые шаблоны мер

Скопируйте, затем переименуйте таблицы и столбцы под свою модель.

Что делаетDAX
Доля от всех категорийCategory % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) )
Доля от того, что оставили срезыVisible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) )
Рост год к годуYoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear )
Нарастающий итог за всё времяRunning Total = CALCULATE ( [Total Sales], FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] <= MAX ( 'Date'[Date] ) ) )
Скользящее среднее за 7 дней (по дням с продажами)Sales 7 Day Avg = AVERAGEX ( DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -7, DAY ), [Total Sales] )
Показать значение только для первых 5Top 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] )
Посчитать клиентов выше порогаBig Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Сделать так, чтобы итог был суммой своих строкBonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] )
Показать значение только на одном уровне матрицыCategory Rank = IF ( ISINSCOPE ( Product[Category] ), RANKX ( ALL ( Product[Category] ), [Total Sales] ) )
Остаток на конец периода: последняя дата, у которой есть значениеClosing Units = CALCULATE ( SUM ( Inventory[Units] ), LASTNONBLANK ( 'Date'[Date], CALCULATE ( SUM ( Inventory[Units] ) ) ) )

Логические и информационные функции

Для условий и для вопросов о том, что содержит контекст фильтра.

Что делаетDAX
Одно условиеIF ( [Total Sales] > 1000, "High", "Low" )
Несколько значений одного выраженияSWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" )
Диапазоны, проверяются сверху внизSWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" )
AND и ORIF ( Sales[Quantity] > 2 && Sales[Amount] > 50, "Big", "Small" )
Значение пустое?ISBLANK ( [Total Sales] )
Первое непустое значениеCOALESCE ( [Total Sales], 0 )
Оставляет ли фильтр ровно одно значение?HASONEVALUE ( Product[Category] )
Это единственное значение или значение по умолчаниюSELECTEDVALUE ( Product[Category], "All categories" )
Сгруппирована ли эта строка визуального элемента по столбцу?ISINSCOPE ( Product[Category] )
Вернуть пустое значениеBLANK ()

Текстовые функции

Оператор & объединяет текст; FORMAT превращает число или дату в текст.

Что делаетDAX
Объединить текстCustomer[First Name] & " " & Customer[Last Name]
Отформатировать числоFORMAT ( [Total Sales], "#,0.00" )
Отформатировать датуFORMAT ( 'Date'[Date], "mmm yyyy" )
Первые символыLEFT ( Product[Code], 3 )
Символы с заданной позицииMID ( Product[Code], 4, 2 )
ДлинаLEN ( Product[Name] )
Верхний регистрUPPER ( Store[City] )
Убрать лишние пробелыTRIM ( Customer[Name] )
Заменить текстSUBSTITUTE ( Customer[Phone], " ", "" )
Позиция текста без учёта регистра (0, если не найден)SEARCH ( "pro", Product[Name], 1, 0 )

Функции даты

Внутри даты хранятся как числа, поэтому их можно вычитать и получать число дней.

Что делаетDAX
Сегодняшняя датаTODAY ()
Собрать датуDATE ( 2025, 12, 31 )
Год датыYEAR ( 'Date'[Date] )
Номер месяцаMONTH ( 'Date'[Date] )
День недели, понедельник равен 1WEEKDAY ( 'Date'[Date], 2 )
Номер недели, недели начинаются с понедельникаWEEKNUM ( 'Date'[Date], 2 )
Последний день месяцаEOMONTH ( 'Date'[Date], 0 )
Тот же день месяцем раньшеEDATE ( 'Date'[Date], -1 )
Число дней между двумя датамиDATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY )
Таблица дат из фиксированных датCALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) )
Таблица дат из дат в моделиCALENDARAUTO ()

Связи и поиск значений

RELATED идёт по связи со стороны «многие» к стороне «один».

Что делаетDAX
Значение со стороны «один» (в столбце таблицы Sales)RELATED ( Product[Category] )
Строки стороны «многие» для текущей строки (в столбце таблицы Customer)COUNTROWS ( RELATEDTABLE ( Sales ) )
Найти значение без связиLOOKUPVALUE ( Product[Price], Product[SKU], Sales[SKU] )
Путь «родитель и потомок» (для иерархий и безопасности на уровне строк)PATH ( Employee[Employee ID], Employee[Manager ID] )
Пользователь, который вошёл в систему, для динамической безопасности на уровне строкUSERPRINCIPALNAME ()

Табличные функции

Они возвращают таблицы: используйте их в вычисляемой таблице, внутри CALCULATE или в итераторе.

Что делаетDAX
Уникальные значения в текущем фильтреVALUES ( Product[Category] )
Строки, которые проходят условиеFILTER ( Product, Product[Price] > 100 )
Первые N строк по мереTOPN ( 5, ALL ( Product[Product] ), [Total Sales] )
Сгруппировать по столбцам и добавить мерыSUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] )
Добавить столбец в таблицуADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] )
Выбрать и переименовать столбцыSELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] )
Список чиселGENERATESERIES ( 1, 10, 1 )
Все сочетания строк двух таблицCROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) )
Поставить одну под другой две таблицы с одинаковыми столбцамиUNION ( 'Sales 2024', 'Sales 2025' )

Переменные

VAR даёт имя шагу и вычисляет его один раз; RETURN возвращает результат.

Что делаетDAX
Одна переменнаяMargin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue )
Несколько переменныхSales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY
Таблица в переменнойTop 5 Total = VAR Top5 = TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) RETURN CALCULATE ( [Total Sales], Top5 )

Шаги Power Query (M)

Power Query приводит данные в нужный вид до загрузки. Это формулы M, которые стоят за часто используемыми кнопками.

Что делаетM
Оставить подходящие строкиTable.SelectRows(Source, each [Status] = "Paid")
Удалить столбцыTable.RemoveColumns(Source, {"Notes", "Temp"})
Задать типы столбцовTable.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}})
Переименовать столбецTable.RenameColumns(Source, {{"amt", "Amount"}})
Добавить столбецTable.AddColumn(Source, "Total", each [Quantity] * [Price], type number)
Объединить два запроса (join)Table.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"}, "Product", JoinKind.LeftOuter)
Добавить запросы (одну таблицу под другой)Table.Combine({Sales2024, Sales2025})
Отменить свёртывание столбцов (столбцы в строки)Table.UnpivotOtherColumns(Source, {"Product"}, "Month", "Amount")
Сгруппировать и агрегироватьTable.Group(Source, {"Category"}, {{"Sales", each List.Sum([Amount]), type number}})
Заменить ошибки значениемTable.ReplaceErrorValues(Source, {{"Amount", 0}})

В этой шпаргалке по Power BI на одной странице собран DAX, который пишут чаще всего: агрегации, итераторы X, CALCULATE и функции, которые меняют фильтры, логика операций со временем, текстовые функции и функции дат, а также шаблоны мер, которые можно скопировать: доля от итога, рост год к году и нарастающий итог.

В примерах используется модель продаж с таблицами Sales, Product, Customer и 'Date'; переименуйте их под свою модель. Весь DAX здесь разобран движком, на котором работает курс Coddy по Power BI: там его можно писать в рабочей области Power BI прямо в браузере и сразу получать проверку.

Частые вопросы о шпаргалке по Power BI

Эта шпаргалка по Power BI бесплатная?

Да. Читайте её здесь или добавьте в закладки, регистрация не нужна.

Чем мера отличается от вычисляемого столбца?

Вычисляемый столбец вычисляется один раз для каждой строки при обновлении и хранится в модели, поэтому по нему можно фильтровать срезом. Мера вычисляется для каждой ячейки визуального элемента, с фильтрами этой ячейки, и ничего не хранит. Итоги и соотношения лучше делать мерами.

Что делает CALCULATE?

Вычисляет выражение с изменёнными фильтрами: добавляет, заменяет или снимает фильтры, а затем считает результат. Почти всё в DAX, что сложнее простых итогов, строится на CALCULATE с правильными аргументами фильтров.

Зачем использовать DIVIDE вместо оператора /?
DIVIDE возвращает пустое значение (или значение, которое вы выберете), когда знаменатель равен нулю или пуст. Оператор / в таком случае возвращает бесконечность или значение ошибки, и оно появляется в визуальных элементах.
Нужна ли таблица дат для логики операций со временем?
Да. Функциям вроде TOTALYTD и SAMEPERIODLASTYEAR нужна таблица с одной строкой на каждый день, без пропусков и с полными годами, связанная с таблицами фактов и отмеченная как таблица дат.
Работает ли этот DAX в Power Pivot для Excel и в Analysis Services?

Язык DAX общий, поэтому почти всё работает и там. Некоторые новые функции сначала появляются в Power BI.

Где потренироваться в DAX?

В курсе Coddy по Power BI: каждый урок открывает рабочую область Power BI в браузере и проверяет вашу меру на данных урока и на их скрытых копиях.

Иллюстрация языков программирования Coddy

Изучайте Power BI с Coddy

Начать