GOC644 — DAX základy (2 dny)
1. Úvod do Power BI 2. Datový model 3. Úvod do DAX 4. Oblasti použití DAX 5. Kontext výpočtu 6. Časová inteligence 7. Optimalizace DAX 8. Row Level Security 9. Nástroje
GOC6441 — Pokročilý DAX (2 dny)
1. Opakování & přehled 2. Dynamické reporty 3. DAX jako dotazovací jazyk 4. VertiPaq engine 5. Ladění výkonu 6. Composite Models 7. Workshop
Cvičení
1. Datový model 2. DAX základy 3. Kontext výpočtu 4. Časová inteligence
🏠 Rozcestník kurzů
GOC6441 · Kapitola 3

DAX jako dotazovací jazyk

Používání DAXu pro dotazování dat — EVALUATE, SUMMARIZE, paginated reporty a DAX Studio
⏱ 75 minut🔨 DAX Studio

Cíle kapitoly

  • Pochopit rozdíl mezi DAX jako kalkulačním jazykem a dotazovacím jazykem
  • Psát a spouštět DAX dotazy s EVALUATE
  • Používat funkce pro dotazování: SUMMARIZE, ADDCOLUMNS, TOPN, ORDER BY
  • Vytvářet datové sady pro Paginated Reports (SSRS/Power BI Paginated)
  • Analýza výkonu v DAX Studio — Server Timings
3.1

DAX jako dotazovací jazyk — rozdíly a rozdělení

DAX má dvě hlavní role: role kalkulační (v measures a sloupcích) a role dotazovací (pro načítání dat).

Kalkulační DAX (budete znát z GOC644)

  • Vyhodnocuje se v kontextu measures nebo sloupců
  • Odpovídá otázce: "Jaká je hodnota pro tento řádek/filtr?"
  • Příklady: SUM, CALCULATE, FILTER v měře
  • Výsledek: Skalár (číslo, text, datum) nebo agregace

Dotazovací DAX (nové v GOC6441)

  • Vrací tabulku dat (narozdíl od skaláru)
  • Odpovídá otázce: "Vyberte mi řádky s těmito sloupci"
  • Spouští se s EVALUATE klauzulí
  • Nejčastěji v DAX Studio nebo Paginated Reports datasetu
  • Příklady: SUMMARIZE, FILTER na tabulku, TOPN

Kde se to používá?

Scénář Typ DAXu Příklad
Measure v kartě vizualizace Kalkulační [Total Sales] — vrací číslo
Sloupec v tabulce Kalkulační Profit = Sales - Cost — vrací text/číslo
Dotaz v DAX Studio Dotazovací EVALUATE SUMMARIZE(...) ORDER BY ...
Dataset pro Paginated Report Dotazovací EVALUATE FILTER(FactSales, [Amount] > 100)
3.2

EVALUATE Statement — základní syntaxe

Struktura DAX dotazu

DAX
EVALUATE <tabulka>
ORDER BY <sloupec1> [ASC | DESC], <sloupec2> [ASC | DESC]
-- Více sloupců = jedna ORDER BY, hodnoty odděleny čárkou

Jednoduchý příklad

DAX
{-- Vrátí všechny sloupce tabulky DimProduct --}
EVALUATE DimProduct
ORDER BY DimProduct[ProductName] ASC

S FILTER() — filtrování dat

DAX
{-- Vrátí jen produkty s cenou vyšší než 100 --}
EVALUATE FILTER (
  DimProduct,
  DimProduct[StandardCost] > 100
)
ORDER BY DimProduct[StandardCost] DESC

S TOPN() — omezení počtu řádků

DAX
{-- Vrátí prvních 10 produktů seřazených podle ceny --}
EVALUATE TOPN (
  10,
  DimProduct,
  DimProduct[StandardCost],
  DESC
)
3.3

Funkce pro dotazování dat

SUMMARIZE() — agregace podle skupin

Seskupí řádky a vrátí agregace.

DAX
{-- Vrátí součet tržeb po kategoriích produktů --}
EVALUATE SUMMARIZE (
  FactInternetSales,
  DimProduct[ProductCategory],
  "Total", SUM ( FactInternetSales[SalesAmount] )
)
ORDER BY [Total] DESC

ADDCOLUMNS() — přidání vypočítaných sloupců

Vezme tabulku a přidá nové sloupce s výpočty.

DAX
{-- Vrátí DimProduct s přidaným sloupcem "Price in EUR" --}
EVALUATE ADDCOLUMNS (
  DimProduct,
  "PriceEUR", DimProduct[ListPrice] * 24
)

SUMMARIZECOLUMNS() — flexibilnější alternativa

Kombinuje SUMMARIZE a ADDCOLUMNS — lepší pro složité dotazy s measure.

DAX
{-- Vrátí tržby a počet objednávek po měsících --}
EVALUATE SUMMARIZECOLUMNS (
  DimDate[MonthYear],
  "Sales", SUM ( FactInternetSales[SalesAmount] ),
  "Orders", COUNTROWS ( FactInternetSales )
)
ORDER BY DimDate[MonthYear]

GENERATEALL() — Cartesian product

Vytváří kombinace všech možných hodnot (kartézský součin).

DAX
{-- Všechny kombinace: Kategorie x Rok --}
EVALUATE GENERATEALL (
  VALUES ( DimProduct[ProductCategory] ),
  VALUES ( DimDate[Year] )
)
💡
SUMMARIZE vs. SUMMARIZECOLUMNS: SUMMARIZE je starší a někdy méně spolehlivý. Moderní přístup: používejte SUMMARIZECOLUMNS pro nové dotazy.
3.4

DAX dotazy pro Paginated Reports

Paginated Reports (SSRS/Power BI Paginated) používají DAX Dataset pro načítání dat. Toto se výrazně liší od interaktivních reportů.

Připojení Paginated Reportu na Power BI model

1
Vytvořte Paginated Report v Power BI Service

Jdete do Power BI Service → New → Paginated Report

2
Přidejte datový zdroj

Vyberte "Power BI dataset" a zvolte svůj model

3
Vytvořte Dataset s DAX dotazem

Paste svůj DAX EVALUATE dotaz v designer okně

Příklad: Paginated Dataset s parametrem

DAX
-- DAX nemá DECLARE — proměnné v dotazu se definují přes DEFINE VAR
DEFINE
  VAR __Category = "Bikes" -- výchozí hodnota pro testování v DAX Studio
EVALUATE
FILTER (
  FactInternetSales,
  RELATED ( DimProduct[ProductCategory] ) = __Category
)

-- V Paginated Report RDL datasetu se používá @Category přímo jako parametr
-- (bez DECLARE) — Power BI Report Builder ho nahradí hodnotou z parametru reportu
⚠
Omezení DAX dotazů v Paginated Reports: Ne všechny funkce DAXu jsou dostupné. Zejména funkce jako PATHCONTAINS() nebo ROWNUMBER() mohou být omezené. Vždy testujte před nasazením.

Parametrizace — spojení s reportem

Paginated Report může mít "Report Parameters" (např. @FromDate, @ToDate). Tyto lze předat DAX dotazu:

DAX
{-- Dotaz s parametry FromDate a ToDate --}
EVALUATE FILTER (
  FactInternetSales,
  FactInternetSales[OrderDate] >= @FromDate &&
  FactInternetSales[OrderDate] <= @ToDate
)
3.5

DAX Studio — analýza výkonu dotazů

DAX Studio je nezbytný nástroj pro optimalizaci. Umožňuje vidět, jak se dotaz chová na úrovni Storage Engine a Formula Engine.

Stažení a instalace

  • Jděte na daxstudio.org a stáhněte si poslední verzi
  • DAX Studio se připojuje k Power BI Desktop, Analysis Services nebo Power BI Service
  • Je to neoficiální, ale komunitou používaný standard v průmyslu

Server Timings — čtení výkonu

Jakmile spustíte dotaz v DAX Studio, kliknete na "Server Timings" tab. Vidíte:

Metrika Co znamená Dobrá hodnota
Total Duration Čas od startu do konce < 1 s pro interaktivní reporty
Storage Engine Time Čas strávený v SE (čtení z VertiPaq) Měl by být vyšší než FE čas — SE pracuje efektivně na komprimovaných datech
Formula Engine Time Čas v interpretaci DAXu Měl by být < 50% Total Duration
SE vs FE poměr Pokud SE >> FE, model je optimizovaný SE/FE > 1.0 je dobré

Čtení Query Planu

Query Plan ukazuje logické kroky, které DAX Engine provádí:

  • CallbackDataID: FE volá SE pro data — znamená neoptimální dotaz
  • Scan: SE čte všechny řádky — OK, pokud je to nutné
  • SeekPredicate: SE filtruje přes dictionary encoding (vyhledání konkrétní kódované hodnoty) — DOBRÉ, efektivní filtrování bez skenování všech řádků
  • Physical Scan: Fyzická operace v VertiPaq — podrobnější informace
Příklad: Server Timings output
Query: EVALUATE FactInternetSales
Total Duration: 0.234 seconds
SE Time: 0.150 seconds
FE Time: 0.084 seconds

Query Plan:
├ RelOp: SeekPredicate Batch=False
│ └ Filter: FactInternetSales[OrderDate] >= @FromDate
└ Output: 50000 rows
✓
Tip: Pokud vidíte CallbackDataID v Query Planu, znamená to, že Formula Engine musí volat Storage Engine opakovaně. Změňte DAX logiku na jednodušší nebo přidejte agregace.