Коротко: DAX (Data Analysis Expressions) — це мова формул, яка використовується в Power BI, Analysis Services і Power Pivot для створення мір, обчислюваних стовпців, обчислюваних таблиць, запитів і visual calculations. Знання базових функцій агрегації, фільтрації, time intelligence, ранжування та ітерації дає змогу розв’язувати значну частину типових аналітичних завдань у Power BI. Стаття для аналітиків, BI-фахівців і всіх, хто будує звіти в Power BI і хоче вийти за межі базових візуалізацій.

Вступ

DAX (Data Analysis Expressions) — це мова формул, яка використовується в Power BI, Analysis Services і Power Pivot для створення мір, обчислюваних стовпців, обчислюваних таблиць і контекстних аналітичних розрахунків.

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

У цій статті розглянемо 20 ключових функцій і конструкцій DAX: від базових агрегацій і CALCULATE до time intelligence, ітераторів, ранжування та змінних. Особливу увагу приділимо контексту фільтра, рядковому контексту й типовим помилкам, через які формула може повертати технічно коректний, але логічно неправильний результат.


Чому DAX є важливою навичкою для аналітика Power BI?

Що таке мова DAX і чим вона відрізняється від Excel-формул

DAX (Data Analysis Expressions) — мова формул, розроблена Microsoft для Power BI, Analysis Services і Power Pivot. Синтаксично вона схожа на Excel, але логіка роботи принципово інша.

Excel-формула прив’язана до клітинки. DAX-міра обчислюється в контексті: залежно від того, які фільтри активні у звіті, яка категорія вибрана у зрізі, який рядок відображається в таблиці. Це і є ключова відмінність — DAX працює з таблицями та зв’язками між ними, а не з діапазонами клітинок.

Саме тому DAX вимагає іншого мислення. Формула може повертати різні значення для одних і тих самих вхідних даних — залежно від контексту фільтрації.

Коли Power BI з DAX краще за Excel або Python для звітності?

Power BI з DAX виграє там, де потрібна інтерактивна звітність поверх великої моделі даних із кількох джерел. Excel добре підходить для табличних розрахунків і ad hoc аналізу, тоді як Power BI з табличною моделлю та DAX зазвичай зручніший для повторюваної інтерактивної звітності, складних зв’язків між таблицями й централізованих семантичних моделей.

Python дає більше гнучкості для трансформацій і ML, але для регулярної бізнес-звітності Power BI + DAX дає швидший результат із меншими витратами на підтримку.


Основні DAX-формули Power BI: агрегація, фільтрація та умовна логіка (вирази 1–10)

Агрегаційні міри: SUM, AVERAGE, MIN, MAX і COUNTROWS (вирази 1–4)

Починаємо з базових агрегацій — тих, що використовуються в кожному другому звіті.

1. SUM — сума значень числового стовпця

SUM підсумовує значення одного числового стовпця. Найчастіше її використовують у мірах, які мають динамічно реагувати на фільтри та структуру візуалізації.

Total Sales =
SUM(Sales[Revenue])

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

2. AVERAGE — середнє значення числового стовпця

AVERAGE обчислює середнє арифметичне непорожніх значень числового стовпця.

Average Revenue per Row =
AVERAGE(Sales[Revenue])

Ця міра повертає середню виручку на один рядок таблиці Sales. Вона не обов’язково дорівнює середньому чеку: якщо одне замовлення складається з кількох рядків, середній чек потрібно розраховувати як загальну виручку, поділену на кількість унікальних замовлень.

3. MIN і MAX — мінімальне та максимальне значення

MIN і MAX повертають відповідно найменше та найбільше значення стовпця в поточному контексті фільтра.

Min Price = MIN(Products[Price])
Max Price = MAX(Products[Price])

4. COUNTROWS — кількість рядків у таблиці

COUNTROWS підраховує рядки таблиці або табличного виразу.

Sales Row Count =
COUNTROWS(Sales)

Ця міра рахує рядки таблиці Sales, а не обов’язково замовлення. Якщо одне замовлення може містити кілька позицій, кількість замовлень потрібно рахувати через унікальний ідентифікатор:

Order Count =
DISTINCTCOUNT(Sales[OrderID])

COUNT підраховує непорожні числові значення стовпця, COUNTROWS — рядки таблиці, а DISTINCTCOUNT — унікальні значення.


Фільтрація та контекст: CALCULATE, FILTER, REMOVEFILTERS і ALLSELECTED (вирази 5–8)

5. CALCULATE — обчислення в модифікованому контексті фільтра

CALCULATE обчислює вираз у зміненому контексті фільтра. Першим аргументом передають вираз або готову міру, а наступними — умови чи функції, які змінюють фільтри.

Online Sales =
CALCULATE(
    [Total Sales],
    Sales[Channel] = "Online"
)

У цьому прикладі [Total Sales] обчислюється лише для рядків, у яких канал продажу дорівнює "Online". CALCULATE може додавати фільтри, замінювати фільтри тих самих стовпців або видаляти їх за допомогою функцій-модифікаторів. Microsoft офіційно визначає її як функцію, що обчислює вираз у модифікованому контексті фільтра.

6. FILTER — створення відфільтрованої таблиці

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

High Value Online Sales =
CALCULATE(
    [Total Sales],
    FILTER(
        Sales,
        Sales[Revenue] > 10000
            && Sales[Channel] = "Online"
    )
)

Для простої умови над одним стовпцем краще передати Boolean-фільтр безпосередньо в CALCULATE:

Online Sales =
CALCULATE(
    [Total Sales],
    Sales[Channel] = "Online"
)

FILTER варто застосовувати тоді, коли умову потрібно обчислювати для кожного рядка або її незручно виразити простим аргументом-фільтром.

7. REMOVEFILTERS — видалення вибраних фільтрів

REMOVEFILTERS видаляє фільтри з указаних таблиць або стовпців. Вона зручна для розрахунку частки конкретного елемента від загального результату.

Product Sales Share =
DIVIDE(
    [Total Sales],
    CALCULATE(
        [Total Sales],
        REMOVEFILTERS(Products[ProductName])
    )
)

У чисельнику обчислюються продажі поточного продукту. У знаменнику видаляється лише фільтр назви продукту, тоді як інші фільтри звіту — наприклад, період, регіон або категорія — залишаються активними. REMOVEFILTERS призначена саме для очищення фільтрів із зазначених таблиць або стовпців.

8. ALLSELECTED — розрахунок відносно видимого вибору

ALLSELECTED видаляє фільтри, створені рядками та стовпцями поточного візуального запиту, але зберігає зовнішні фільтри й явний вибір користувача. Функцію часто використовують для розрахунку частки від видимого підсумку.

Product Share of Selected =
DIVIDE(
    [Total Sales],
    CALCULATE(
        [Total Sales],
        ALLSELECTED(Products[ProductName])
    )
)

Наприклад, якщо користувач вибрав у зрізі лише певну категорію, знаменник охоплюватиме продукти з цього вибраного набору, а не всю модель. ALLSELECTED зберігає зовнішні явні фільтри, тому підходить для visual totals.


Умовна логіка: IF і SWITCH (вирази 9–10)

9. IF — умовне повернення значення

IF перевіряє логічну умову й повертає одне значення, якщо умова істинна, та інше — якщо вона хибна.

Sales Status =
IF(
    [Total Sales] > 100000,
    "High",
    "Low"
)

Міра динамічно повертатиме статус для поточного контексту: наприклад, окремого регіону, продукту або періоду.

10. SWITCH — вибір одного результату з кількох варіантів

SWITCH зручно використовувати замість кількох вкладених IF, коли потрібно зіставити одне значення з кількома можливими варіантами. Наведений нижче вираз створюється як обчислюваний стовпець:

Region Label =
SWITCH(
    Sales[Region],
    "UA", "Україна",
    "PL", "Польща",
    "DE", "Німеччина",
    "Інше"
)

Для міри потрібно спочатку отримати одне значення регіону з поточного контексту:

Selected Region Label =
SWITCH(
    SELECTEDVALUE(Sales[Region]),
    "UA", "Україна",
    "PL", "Польща",
    "DE", "Німеччина",
    "Інше"
)

Конструкція SWITCH(TRUE(), ...) дає змогу послідовно перевіряти довільні логічні умови.


DAX Time Intelligence: як правильно розраховувати динаміку в Power BI (вирази 11–14)

Порівняння з попереднім періодом: SAMEPERIODLASTYEAR і DATEADD (вирази 11–12)

Time intelligence — це група функцій DAX для розрахунків у часі: порівняння з минулим роком, накопичувальні підсумки, ковзні вікна.

Для класичних time intelligence функцій найнадійнішим підходом залишається окрема календарна таблиця з повним діапазоном дат, унікальним стовпцем дати та коректним зв’язком із таблицею фактів. У певних моделях таблицю також потрібно позначити як Date Table. Сучасний Power BI додатково підтримує calendar-based time intelligence, однак окрема календарна таблиця все одно залишається рекомендованою практикою.

11. SAMEPERIODLASTYEAR — той самий період попереднього року

SAMEPERIODLASTYEAR повертає набір дат, зміщений на один рік назад відносно поточного контексту дат.

Sales LY =
CALCULATE(
    [Total Sales],
    SAMEPERIODLASTYEAR(Dates[Date])
)

YoY Growth % =
DIVIDE(
    [Total Sales] - [Sales LY],
    [Sales LY]
)

Якщо для попереднього року немає значення, DIVIDE без третього аргументу поверне BLANK(), що зазвичай точніше, ніж штучне значення 0%.

12. DATEADD — зміщення поточного періоду

DATEADD зміщує поточний набір дат на задану кількість днів, місяців, кварталів або років.

Sales Previous Month =
CALCULATE(
    [Total Sales],
    DATEADD(Dates[Date], -1, MONTH)
)

На відміну від SAMEPERIODLASTYEAR, DATEADD дає змогу задавати різні одиниці та величини зсуву.


Накопичувальні підсумки: TOTALYTD, TOTALMTD і TOTALQTD (вираз 13)

13. TOTALYTD, TOTALMTD і TOTALQTD — накопичувальні підсумки

Ці функції обчислюють накопичувальний результат від початку відповідного календарного періоду до останньої дати поточного контексту.

Sales YTD =
TOTALYTD([Total Sales], Dates[Date])

Sales MTD =
TOTALMTD([Total Sales], Dates[Date])

Sales QTD =
TOTALQTD([Total Sales], Dates[Date])

TOTALYTD обчислює результат від початку року, TOTALMTD — від початку місяця, а TOTALQTD — від початку кварталу.

Для класичного фінансового року, який завершується не 31 грудня, у TOTALYTD або DATESYTD можна передати дату завершення року. Для складніших фінансових календарів краще використовувати окрему календарну таблицю з готовими атрибутами фінансових періодів.


Ковзне вікно: DATESINPERIOD (вираз 14)

14. DATESINPERIOD — ковзний часовий інтервал

DATESINPERIOD повертає набір дат у визначеному інтервалі відносно заданої точки відліку. Її можна використовувати для ковзних сум та середніх.

Ковзна сума за 30 днів:

Sales Rolling 30D =
VAR LastVisibleDate = MAX(Dates[Date])
RETURN
CALCULATE(
    [Total Sales],
    DATESINPERIOD(
        Dates[Date],
        LastVisibleDate,
        -30,
        DAY
    )
)

Формула повертає суму продажів за ковзний 30-денний період, який завершується останньою видимою датою.

Ковзне середнє денних продажів:

Average Daily Sales Rolling 30D =
VAR LastVisibleDate = MAX(Dates[Date])
VAR PeriodDates =
    DATESINPERIOD(
        Dates[Date],
        LastVisibleDate,
        -30,
        DAY
    )
RETURN
AVERAGEX(
    PeriodDates,
    CALCULATE([Total Sales])
)

Друга формула обчислює продажі для кожної дати в періоді, а потім повертає їх середнє значення.


Розширені DAX-вирази: RANKX, TOPN, DIVIDE, змінні та ітератори (вирази 15–20)

Ранжування та топ-N: RANKX і TOPN (вирази 15–16)

15. RANKX — динамічне ранжування

RANKX обчислює вираз для кожного рядка заданої таблиці й визначає позицію поточного значення серед отриманих результатів.

Product Rank =
RANKX(
    ALLSELECTED(Products[ProductName]),
    [Total Sales],
    ,
    DESC,
    DENSE
)

ALLSELECTED формує список продуктів у межах поточного зовнішнього вибору користувача. Міра [Total Sales] обчислюється для кожного продукту, після чого RANKX присвоює ранги від найбільшого значення до найменшого.

Якщо першим аргументом передати таблицю, уже відфільтровану до одного продукту, функція матиме лише одне значення для порівняння й може повертати ранг 1 у кожному рядку.

16. TOPN — вибір рядків із найвищими або найнижчими значеннями

TOPN повертає табличний вираз із рядками, які мають найвищі або найнижчі значення заданого показника. Отриману таблицю можна передати в CALCULATE як фільтр.

Top 5 Products Sales =
VAR TopProducts =
    TOPN(
        5,
        ALLSELECTED(Products[ProductName]),
        [Total Sales],
        DESC,
        Products[ProductName],
        ASC
    )
RETURN
CALCULATE(
    [Total Sales],
    KEEPFILTERS(TopProducts)
)

Спочатку TOPN визначає п’ять продуктів із найбільшими продажами в межах поточного вибору. Потім CALCULATE обчислює сумарні продажі для цього набору.

Додаткове сортування за назвою продукту робить відбір передбачуванішим у разі однакових значень продажів.


Безпечний поділ і змінні: DIVIDE та VAR…RETURN (вирази 17–18)

17. DIVIDE — поділ із контрольованою обробкою нульового знаменника

DIVIDE виконує поділ і повертає BLANK() або задане альтернативне значення, якщо знаменник дорівнює нулю чи BLANK().

Спочатку створіть базову міру прибутку:

Total Profit =
SUM(Sales[Profit])

Після цього створіть міру рентабельності:

Margin % =
DIVIDE(
    [Total Profit],
    [Total Sales]
)

У цьому випадку відсутність виручки поверне BLANK(). Це зазвичай точніше, ніж повертати 0%, адже нульова маржа й відсутність даних мають різне значення. Microsoft рекомендує DIVIDE, коли знаменник є виразом, який може повернути нуль або порожнє значення.

18. VAR…RETURN — використання змінних у DAX

Конструкція VAR...RETURN дає змогу зберігати проміжні результати у змінних, повторно використовувати їх і зробити формулу зрозумілішою.

Margin Analysis =
VAR TotalRevenue = [Total Sales]
VAR TotalCost    = SUM(Sales[Cost])
VAR GrossProfit  = TotalRevenue - TotalCost
RETURN
DIVIDE(
    GrossProfit,
    TotalRevenue
)

Змінні спрощують читання й налагодження складних мір. Якщо один вираз використовується кілька разів, змінна також допомагає уникнути дублювання формули.


Ітераційні функції SUMX і AVERAGEX: рядковий контекст у DAX (вирази 19–20)

19. SUMX — сума результатів рядкового виразу

SUMX проходить по рядках заданої таблиці, обчислює вираз для кожного рядка, а потім підсумовує отримані значення.

Calculated Sales Amount =
SUMX(
    Sales,
    Sales[Quantity] * Sales[UnitPrice]
)

Ця міра спочатку множить кількість товару на ціну одиниці для кожного рядка, а потім підсумовує результати. Звичайна SUM не підходить для такого розрахунку, оскільки вона приймає лише один готовий числовий стовпець.

20. AVERAGEX — середнє значення результатів рядкового виразу

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

Average Product Sales =
AVERAGEX(
    VALUES(Products[ProductID]),
    [Total Sales]
)

VALUES формує список унікальних продуктів у поточному контексті. Для кожного продукту обчислюється [Total Sales], після чого AVERAGEX повертає середній обсяг продажів на продукт.

Ітераційні функції створюють рядковий контекст для кожного рядка таблиці. Це відрізняється від контексту фільтра, який визначає набір даних, доступний для обчислення. Під час виклику готової модельної міри всередині ітератора context transition виконується автоматично.


Типові помилки у DAX Power BI: чому формула не працює або дає неправильний результат

Плутанина між контекстом рядка і контекстом фільтра

Контекст фільтра — це набір активних фільтрів у звіті (зрізи, вибір у візуалізації). Контекст рядка — це поточний рядок під час ітерації (SUMX, AVERAGEX, обчислюваний стовпець).

У рядковому контексті звичайна агрегація, наприклад SUM(Sales[Revenue]), не перетворює поточний рядок на фільтр автоматично. Для такого виразу може знадобитися CALCULATE, яка виконує context transition. Якщо ж у рядковому контексті викликається вже створена модельна міра, context transition відбувається автоматично.

Міри vs обчислювані стовпці: коли що використовувати

Міри використовують для динамічних агрегацій, які мають реагувати на фільтри й структуру візуалізації.

Обчислювані стовпці використовують для значень, що мають існувати на рівні кожного рядка й можуть знадобитися для групування, сортування, зв’язків або фільтрації. Вибір також залежить від режиму моделі, обсягу даних і можливості виконати обчислення ще на етапі Power Query або в джерелі.

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

Проблеми з продуктивністю: коли DAX гальмує звіт

Поширені причини низької продуктивності:

  • Складна або неправильно побудована модель даних;
  • Двонапрямні зв’язки без необхідності;
  • Використання висококардинальних стовпців;
  • Ітератори над великими таблицями;
  • Надмірне використання FILTER над таблицею фактів;
  • Складні обчислювані стовпці в Import-моделі;
  • Невдалі міри, які запускають дорогі Formula Engine операції;
  • Надмірна кількість візуалізацій і запитів на сторінці;
  • Неефективні DirectQuery-запити або відсутність query folding у підготовці даних.

Для первинного аналізу використовуйте вбудований Performance Analyzer у Power BI Desktop. Для детальнішого профілювання semantic model і DAX-запитів можна використовувати безкоштовний сторонній інструмент DAX Studio.

Power BI підключається до різних джерел даних — від реляційних баз до NoSQL і хмарних сховищ. Розуміння архітектури джерел допомагає будувати ефективніші моделі — про це докладніше у Типи баз даних у 2026.


FAQ: питання про DAX у Power BI

Питання: Що таке DAX у Power BI?
Відповідь: DAX (Data Analysis Expressions) — мова формул у Power BI для створення мір, обчислюваних стовпців і таблиць. Вона дозволяє виконувати складні розрахунки з урахуванням контексту фільтрації та рядка. На відміну від Excel, DAX працює з таблицями та зв’язками між ними, а не з окремими клітинками. Це дає змогу будувати гнучкі динамічні звіти, де результат обчислення змінюється залежно від вибору користувача у фільтрах і зрізах.

Питання: Як почати роботу з DAX у Power BI?
Відповідь: Відкрийте Power BI Desktop, завантажте дані, побудуйте базову модель зі зв’язками та створіть окрему таблицю для мір. Після цього додайте першу міру через команду «Нова міра» у вкладці «Моделювання» або в контекстному меню таблиці. Почніть із SUM, AVERAGE і COUNTROWS, а потім перейдіть до CALCULATE та функцій керування контекстом. Застосовуйте формули до реальних або навчальних наборів даних, наприклад Contoso чи AdventureWorks. Для первинної діагностики використовуйте Performance Analyzer, а для детального аналізу DAX-запитів — DAX Studio.

Питання: DAX vs SQL — що краще для аналізу даних?
Відповідь: DAX і SQL вирішують різні задачі. SQL використовується для визначення, вибірки, трансформації, агрегації та керування даними в реляційних і деяких аналітичних системах. DAX переважно застосовується для динамічних контекстних обчислень поверх табличної семантичної моделі в Power BI та Analysis Services. Аналітику корисно знати обидві: SQL для роботи з джерелами даних, DAX для побудови мір і звітів. Вони доповнюють одна одну, а не конкурують. Знання SQL прискорює розуміння DAX, але жорсткої залежності між ними немає.

Питання: Чи є безкоштовна версія Power BI для роботи з DAX?
Відповідь: Power BI Desktop доступний безкоштовно для локального створення моделей і звітів. Для публікації, спільної роботи й розповсюдження контенту в Power BI service можуть знадобитися ліцензії Power BI Pro, Premium Per User або відповідна Fabric/Premium capacity. Станом на червень 2026 року базова ціна Power BI Pro у США становить 14 доларів за користувача на місяць при річній оплаті, але ціна може відрізнятися залежно від країни, податків і корпоративної угоди.

Питання: Які помилки найчастіше роблять при роботі з DAX у Power BI?
Відповідь: Найпоширеніша помилка — плутанина між контекстом рядка та контекстом фільтрації. Це призводить до неправильних результатів у мірах, і діагностувати таку помилку буває складно без розуміння базової механіки DAX. Друга типова помилка — надмірне використання обчислюваних стовпців замість мір, що збільшує розмір моделі. Третя — ігнорування CALCULATE як основного інструменту для модифікації контексту. І окремо: некоректна календарна модель може спричинити помилкові або неповні результати time intelligence. Для класичних функцій рекомендовано використовувати окрему календарну таблицю, а для нових calendar-based функцій діють окремі правила.


Підсумок: як системно прокачати DAX та Power BI

Швидкий підсумок: 20 формул одним списком

  1. SUM — підсумовує значення числового стовпця.
  2. AVERAGE — обчислює середнє значення числового стовпця.
  3. MIN / MAX — повертають мінімальне та максимальне значення.
  4. COUNTROWS — підраховує рядки таблиці або табличного виразу.
  5. CALCULATE — обчислює вираз у модифікованому контексті фільтра.
  6. FILTER — повертає таблицю, рядки якої відповідають умові.
  7. REMOVEFILTERS — видаляє фільтри з указаних таблиць або стовпців.
  8. ALLSELECTED — зберігає зовнішній вибір користувача для розрахунку видимих підсумків.
  9. IF — повертає один із двох результатів залежно від умови.
  10. SWITCH — вибирає результат із кількох можливих варіантів.
  11. SAMEPERIODLASTYEAR — повертає відповідний період попереднього року.
  12. DATEADD — зміщує поточний набір дат на заданий інтервал.
  13. TOTALYTD / TOTALMTD / TOTALQTD — обчислюють накопичувальні підсумки від початку періоду.
  14. DATESINPERIOD — формує ковзний часовий інтервал.
  15. RANKX — виконує динамічне ранжування.
  16. TOPN — повертає рядки з найвищими або найнижчими значеннями.
  17. DIVIDE — виконує поділ із контрольованою обробкою нульового знаменника.
  18. VAR...RETURN — дає змогу використовувати проміжні змінні.
  19. SUMX — підсумовує результати виразу, обчисленого для кожного рядка.
  20. AVERAGEX — повертає середнє значення результатів рядкового виразу.

Авторська позиція: DAX — це дисципліна, а не магія

На початку DAX може здаватися складним, оскільки його результат залежить не лише від формули, а й від моделі даних, зв’язків і поточного контексту. Після того як ви зрозумієте різницю між рядковим контекстом і контекстом фільтра та опануєте CALCULATE, вивчати наступні DAX-функції буде значно простіше. Головна порада: будуйте реальні звіти, а не читайте документацію в абстрактному режимі. Кожна нова задача — це привід розібратися з ще однією функцією.

Упевнене володіння DAX, моделюванням даних і оптимізацією semantic model є важливою складовою професійного розвитку Power BI та BI-аналітика.

Що далі: ресурси та курси для глибшого занурення

Якщо хочете опанувати Power BI, DAX і весь стек BI-інструментів системно — спеціалізація Data Analytics & BI Engineer охоплює Power BI, DAX та інші інструменти аналітики й містить практичні завдання та проєктну роботу.

Який із 20 розглянутих виразів став для вас відкриттям?