Top DAX funkce pro každodenní použití
- Vojtěch Šíma
- Feb 19
- 13 min read
tl;dr DAX má v sobě pravděpodobně pár stovek funkcí, ne všechny jsou si však rovny. V dnešním článku představím funkce, které stojí za naučení. Z podstaty tl;dr bych je zde normálně vepsal, ale trošku níže je tabulka s obsahem, kde je celý list.
Disclaimer: Pokud tu nevidíte svou oblíbenou funkci, neznamená to, že je špatná. Tento článek se zaměřuje na můj výběr opravdu klíčových funkcí.
Vysvětlení seznamu funkcí
Nebudu se v tomto článku pouštět do konceptů DAX (Data Analysis Expressions) ani podrobných vysvětlení. Místo toho půjdu rovnou k věci a představím seznam nejužitečnějších funkcí. Každou z nich krátce popíšu a doplním reálnými příklady. Abych udržel přehlednost, rozdělil jsem je do kategorií—začínám těmi nejdůležitějšími, takže na pořadí též záleží.
Tabulka obsahu (s odkazy na sekce stránky)
Základní agregátory
Funkce filtru
Iterativní funkce
Time Intelligence funkce
Ostatní důležité funkce
Základní agregátory
Naučení těchto funkcí rozhodně nešlápnete vedle, garantuji, že aslespoň jednu z nich využiteje v každém reportu.
SUM
SUM([column])
Sečte všechna čísla ve sloupci.
Sečte čísla ve sloupci, žádné čáry máry.
AVERAGE
AVERAGE([column])
Vrátí průměr (aritmetický průměr) všech čísel ve sloupci.
Stejně jako SUM, základní agregátor, zvlášť s kombinací iterátorů (ale o tom později).
COUNTROWS
COUNTROWS(<table>)
Funkce COUNTROWS spočítá počet řádků v zadané tabulce nebo v tabulce definované výrazem.
Funkce spočítá počet řádky v tabulce. Mnohé možná překvapí, proč je COUNTROWS tak vysoko, ale vzhledem k tomu, jak modeluji své reporty, obvykle potřebuji spočítat celé tabulky, nikoliv jen jednotlivé sloupce.
DISTINCTCOUNT
DISTINCTCOUNT([column])
Spočítá počet jedinečných hodnot ve sloupci.
Kolikrát potřebujete spočítat jedinečné hodnoty ve sloupci, namísto celkové počtu, na to slouží DISTINCOUNT.
COUNT
COUNT([column])
Spočítá počet řádků v zadaném sloupci, které obsahují neprázdné hodnoty.
Konečně jednoduchý počet - COUNT. Stále velmi užitečná funkce, ale je dobré mít na paměti, že přeskočí prázdné/null hodnoty. To může být někdy matoucí, a proto se v mnoha případech vyplatí použít COUNTROWS nebo DISTINCTCOUNT, zejména pokud chcete spočítat počet ID v tabulce.
MIN/MAX
MIN/MAX([column]); MIN/MAX(<expression1>, <expression2>)
Vrátí nejnižší/největší hodnotu ve sloupci nebo mezi dvěma skalárními výrazy.
V neposlední řadě jsou tu MIN a MAX. Samozřejemě dokáží vrátit nejnižší/nejvyšší hodnotu data či čísla, nicméně hlavní roli mají ve spolupráci s výrazy filtru, agregací nebo dokonce pro práci s aktuálním kontextem. Často tak eliminují potřebu dlouhé (na počet znaků) funkce SELECTEDVALUE.
Funkce filtru
Druhou nejdůležitější skupinu tvoří filtrační funkce, které umožňují filtrovat agregované hodnoty na základě výrazu nebo upravit kontext, ve kterém jsou tyto hodnoty vyhodnocovány.
CALCULATE
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
Vyhodnotí výraz v upraveném kontextu filtru.
Pro mě je CALCULATE funkce číslo jedna. Pokud máte dobře strukturovaný model, můžete s ní vytvořit něco skutečně elegantního—téměř jako umělecké dílo. Stačí jenom nad tím tolik nepřemýšlet (anebo naopak ano?).
CALCULATE umožňuje elegantně aplikovat filtry, ale nejlépe funguje, pokud dodržujete určitá pravidla: filtrujte sloupce, ne celé tabulky, a snažte se vyhnout použití funkce FILTER přímo ve filtračním výrazu CALCULATE.
Nejjednodušší způsob použití CALCULATE je zápis 'Tabulka'[Sloupec] = "xx", ale to je jenom základní použití. Jednou z jejích největších předností je schopnost upravovat filtrační kontext pomocí široké škály dalších funkcí (některé z nich si projdeme). Díky tomu můžete aktivovat neaktivní relace, "ignorovat" filtry uvnitř i vně dotazu nebo využívat výkonné funkce Time Intelligence.
REMOVEFILTERS
REMOVEFILTERS([<table> | <column>[, <column>[, <column>[,…]]]])
Vymažte filtry ze zadaných tabulek nebo sloupců.
Nejčastěji se REMOVEFILTERS používá ve filtračních výrazech funkce CALCULATE, kde odstraňuje filtry—jednoduché, že? Tato funkce je obzvlášť užitečná, pokud chcete zajistit, aby určité výpočty nebyly ovlivněny konkrétními filtry. Můžete ji použít k odstranění filtrů z celé tabulky nebo jen z konkrétního sloupce.
To se hodí například při výpočtu podílu na celku. Pokud máte dataset s produktovými kategoriemi a barvami a chcete zjistit, jaké procento tvoří každá barva v rámci své kategorie, můžete ignorovat filtr na barvu výpočet celku a poté provést zbývající výpočty. Takhle dokážete vypočítat třeba procentuální zastoupení jednotlivých barev v dané kategorii.
REMOVEFILTERS je podobná funkci ALL, ale při použití uvnitř CALCULATE se obvykle doporučuje REMOVEFILTERS, protože má lepší výkon a méně neduhů.
ALL
ALL( [<table> | <column>[, <column>[, <column>[,…]]]] )
Vrátí všechny řádky v tabulce nebo všechny hodnoty ve sloupci a ignoruje všechny použité filtry. Tato funkce je užitečná pro vymazání filtrů a vytváření výpočtů na všech řádcích tabulky.
Nejčastěji se ALL používá ve filtračních výrazech CALCULATE, a někdy umí pořádně zamotat hlavu—zvlášť když se začnete učit o ALLSELECTED.
Klíčem k pochopení je toto: cokoli vložíte do ALL, to se vám vrátí v "plné délce" - získáte všechny řádky této tabulky nebo sloupce. Jinými slovy—ignorujete všechny filtry, které by na ně mohly být aplikovány.
Pokud chcete trošku alternativní způsob vysvětlení, představte si ALL jako vašeho strýce u rodinné oslavy, který řekne vše, co se mu honí hlavou, a naprosto ignoruje jakékoliv náznaky nějaké ohleduplnosti, prostě na vás vše vyvalí. Stejně jako on, funkce ALL ignoruje jakékoliv filtry, které by měly přicházet z dané tabulky či sloupce.
ALLSELECTED
ALLSELECTED([<tableName> | <columnName>[, <columnName>[,…]]] )
Odebere kontextové filtry ze sloupců a řádků v aktuálním dotazu a zachová všechny ostatní kontextové filtry nebo explicitní filtry.
Nejčastěji se ALLSELECTED používá ve filtračních výrazech CALCULATE a funguje velmi podobně jako ALL. Rozdíl? ALLSELECTED se chová jako ALL, ale pouze uvnitř samotného dotazu. Vnější filtry vás stále ovlivní.
„Uvnitř dotazu“ znamená v rámci vizualizace, kde je umístěna metrika. Myslím, že si to zaslouží obrázek:

První tabulka zobrazuje běžný SUM. Druhá tabulka používá stejný SUM, ale s ALLSELECTED.
V druhé vizualizaci (uvnitř dotazu) jsou ignorovány jednotlivé řádky. Vidíte, že A normálně ukazuje 100 a B 200, ale zde oba zobrazují 300. To se děje proto, že ALLSELECTED uvnitř dotazu nerespektuje filtrační kontext na úrovni řádků.
Nicméně externí dotaz (například slicer napravo) stále filtruje vizualizaci. V tomto případě filtruje A a B, což znamená, že vnější filtr zůstává zachován. Výsledkem je, že pro každý výběr dostanete součet hodnot obou písmen.
Jelikož mě bavila předchozí vysvětlivka, představte si ALLSELECTED jako bandu puberťáků. Doma snahy jejich mamky naprosto ignorují (interní filtry). Na druhous tranu, jakmile Jarmila z Béčka něco řekne (externí filtry), hnedka zpozorní—protože je Jarmilka královna třídy a co řekne, to je trendy.
USERELATIONSHIP
USERELATIONSHIP([columnName1],[columnName2])
Určuje relaci, která se má použít v určitém výpočtu jako relace, která existuje mezi columnName1 a columnName2.
Technicky vzato jde o relační funkci, ale nejčastěji se používá ve filtračních výrazech CALCULATE.
Jako začátečník pravděpodobně o tuto funkce ani nezakopnete, ale jakmile se trošku "naskillíte", ušetří vám spoustu času při modelování v Power BI. Místo toho, abyste se snažili pracovat s více aktivními relacemi, můžete se soustředit na jednu hlavní aktivní relaci a vedle ní vytvořit několik neaktivních relací (často pro datumová pole, ale nejen pro ně).
Díky tomuto přístupu můžete snadno přepínat mezi relacemi přímo v míře (measure), což vám umožní zobrazit ve stejné vizualizaci dvě různé míry—každou ovlivněnou jiným datumovým polem (za předpokladu, že máte kalendářní tabulku).
KEEPFILTERS
KEEPFILTERS(<expression>)
Upraví způsob použití filtrů při vyhodnocování funkce CALCULATE nebo CALCULATETABLE.
Používá se ve filtračních výrazech CALCULATE, kde KEEPFILTERS obaluje filtrační výraz. Hlavním cílem je opravit nežádoucí chování nebo vyřešit situace, kdy funkce může produkovat vizuálně matoucí výsledky.
Příklad použití

V tomto příkladu je sum_a nastaven tak, aby filtroval pouze písmeno "A". Za normálních okolností by ostatní písmena (B, C atd.) byla filtrována současně s "A" a svým vlastním písmenem. Protože to není logicky možné, filtr na "A" má přednost, což způsobuje, že se míra vždy vrací na součet pro "A", a tím pádem vypadá, jako by se hodnota opakovala na všech řádcích.
Naopak sum_a_keepsfilters aplikuje stejný filtr, ale tentokrát je obalena funkcí KEEPFILTERS. To zajistí, že se respektují stávající řádkové filtry, takže se míra zobrazí pouze tam, kde filtr dává smysl—tedy pouze u "A", zatímco ostatní písmena zůstanou prázdná.
sum_a_keepsfilters =
CALCULATE(
[sum],
KEEPFILTERS('dimension'[dimension] = "a")
)
Bez použití KEEPFILTERS by vzorec vypadal takto:
sum_a =
CALCULATE(
[sum],
'dimension'[dimension] = "a"
)
SELECTEDVALUE
SELECTEDVALUE([columnName],[, <alternateResult>])
Vrátí hodnotu, pokud je kontext pro columnName filtrován pouze na jednu jedinečnou hodnotu. V opačném případě vrátí hodnotu alternateResult.
SELECTEDVALUE se často používá ve výrazech, kde je potřeba vyhodnotit aktuální hodnotu vůči jiným hodnotám. Běžně se také využívá jako proměnná uvnitř měr.
Je důležité si uvědomit, že pokud má sloupec v daném kontextu více než jednu hodnotu, SELECTEDVALUE vrátí BLANK—pokud tedy neurčíte alternativní výsledek.
Iterativní funkce
Iterátory vyžadují tabulku a výraz, který se vyhodnocuje pro každý řádek, čímž zavádějí řádkový kontext do měr.
Klíčem je najít správnou rovnováhu—při správném použití mohou nahradit potřebu fyzických sloupců v modelu a zlepšit efektivitu. Naopak, při nesprávném použití mohou výrazně zpomalit report, protože výpočty probíhají řádek po řádku.
SUMX, AVERAGEX, COUNTX
SUMX,AVERAGEX,COUNTX(<table>,<expression>)
Vrátí součet/průměr/počet výrazu vyhodnoceného pro každý řádek v tabulce.
Podobně jako jejich základní varianty provádějí tyto funkce součet, průměr nebo počet. Protože však fungují jako iterátory, jejich syntaxe se liší a vyžadují specifické scénáře použití.
Použijete je, když je potřeba nejprve spočítat výraz pro každý řádek a teprve poté výsledky sečíst, zprůměrovat nebo spočítat. Například pokud chcete průměrný objem tržeb, ale máte pouze sloupce množství a jednotková cena, můžete napsat:
AVERAGEX('table', 'table'[quantity] * 'table'[unitPrice])
Tento zápis vrátí správnou hodnotu bez nutnosti vytvářet fyzický sloupec.
Jakmile získáte více zkušeností, kombinace iterátorů s funkcemi jako VALUES nebo SUMMARIZE se stane mocným nástrojem. Díky tomu můžete například vypočítat průměrné hodnoty agregované podle měsíců nebo jiných dimenzí.
VALUES
VALUES(<TableNameOrColumnName>)
Pokud je vstupním parametrem název sloupce, vrátí tabulku s jedním sloupcem, která obsahuje jedinečné hodnoty ze zadaného sloupce. Duplicitní hodnoty se odeberou a vrátí se pouze jedinečné hodnoty.
Zařadil jsem VALUES mezi iterátory, i když technicky vzato iterátorem není. Jak už bylo zmíněno, často se však používá k iteraci přes jedinečné hodnoty a provádění výpočtů pro každou z nich.
VALUES je čistě tabulková funkce, což znamená, že ji nelze vrátit přímo v míře, protože vrací tabulku, nikoli skalární hodnotu. Můžete ji však kombinovat s CALCULATETABLE a dalšími funkcemi, které upravují filtry, což z ní dělá silný nástroj pro kontrolu kontextu ve výpočtech.
SUMMARIZE
SUMMARIZE (<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>, <expression>]…)
Vrátí souhrnnou tabulku požadovaných součtů v sadě skupin.
Podobně jako VALUES je tato funkce neuvěřitelně užitečná, zejména v kombinaci s iterátory, protože umožňuje rozšířit úroveň seskupení, pokud potřebujete pracovat s více než jedním sloupcem.
Například pokud chcete seskupit data podle dvou dimenzí a následně vypočítat průměr, SUMMARIZE je správná volba.
V praxi lze tuto funkci využít i k vytvoření „pseudo“ primárního klíče, pokud potřebujete unikátní identifikátor napříč více sloupci. Můžete pak například počítat jedinečné kombinace těchto sloupců pro hlubší analýzu.
CONCATENATEX
CONCATENATEX(<table>, <expression>[, <delimiter> [, <orderBy_expression> [, <order>]]...])
Zřetězí výsledek výrazu vyhodnoceného pro každý řádek tabulky.
Moje oblíbená funkce při tvorbě textových měr—ať už pro informační panely zobrazující filtrované hodnoty, nebo pro dynamické zprávy na kartách, pokud je přítomno více hodnot.
Příklad z praaxe: V kombinaci s Row-Level Security (RLS) můžete CONCATENATEX využít k informování uživatelů o jejich přístupu. Když si otevřou report a nejsou si jisti, jaká data mohou vidět, můžete jim zobrazit seznam hodnot, ke kterým mají přístup v rámci konkrétních dimenzí. Tím jim pomůžete lépe pochopit jejich povolený datový rozsah.
Time Intelligence funkce
DAX nabízí celou řadu výkonných vestavěných funkcí pro výpočty založené na čase. Celý soubor Time Intelligence funkcí funguje jako "syntaktický cukr" (syntax sugar), což znamená, že místo psaní složitých CALCULATE výrazů můžete jednoduše odkázat na tyto funkce a získat požadované výsledky.
Pokud pracujete s meziročním srovnáním nebo jinými časovými porovnáními, jsou Time Intelligence funkce nepostradatelné. Jen mějte na paměti, že pro jejich správné fungování je nutné mít správně nastavenou kalendářní tabulku.
TOTALMTD, TOTALYTD, TOTALQTD
TOTALMTD/YTD/QTD(<expression>,<dates>[,<filter>])
Vyhodnotí hodnotu expression pro měsíc/rok/kvartál k datu v aktuálním kontextu.
Jak už název napovídá, tato funkce vyhodnocuje zadaný výraz pro aktuální měsíc, rok nebo čtvrtletí. Obvykle se používá s existující měrou jako výrazem.
Tyto funkce pracují na principu "to-date", což znamená, že počítají hodnoty od prvního dne vybraného intervalu (měsíce, čtvrtletí nebo roku) až do posledního dne v aktuálním výběru.
Například u MTD (Month-to-Date):
Pokud zvolíte 26. den měsíce, výpočet zahrne data od 1. do 26. dne.
Pokud nevyberete konkrétní den, rozšíří se výpočet na poslední dostupné datum v kalendáři.
V lednu by tedy funkce pokryla celý měsíc od 1. do 31.
Stejná logika platí pro QTD (Quarter-to-Date) a YTD (Year-to-Date).
Jedna důležitá věc. Pokud neposkytnete žádný kontext (tj. nefiltrujete dimenzi Datum), funkce vždy vezme nejvyšší dostupné datum v kalendáři, čímž zajistí správný kontext. Naopak funkce jako PREVIOUSMONTH pracují opačně—vybírají nejmenší dostupný měsíc, což osobně nemám rád a raději se jim vyhýbám.
Dobrá zpráva je, že všechny funkce, které zde zmíním, pracují s MAX datem místo MIN datem, což zajišťuje konzistentní chování ve výpočtech.
DATESINPERIOD
DATESINPERIOD(<dates>, <start_date>, <number_of_intervals>, <interval>)
Vrátí tabulku obsahující sloupec kalendářních dat začínající zadaným počátečním datem a pokračuje pro zadané číslo a typ intervalů kalendářních dat.
Používaná hlavně ve filtračních výrazech CALCULATE, funkce DATESINPERIOD umožňuje vybrat konkrétní časové období na základě intervalu dnů, měsíců, čtvrtletí nebo let. Běžným příkladem použití je výpočet součtu za poslední 3 nebo 12 měsíců dynamicky.
Například výpočet součtu za poslední 3 měsíce:
CALCULATE(
[sum],
DATESINPERIOD('calendar'[Date], MAX('calendar'[Date]), -3, MONTH)
)
Zde druhý parametr (MAX('calendar'[Date])) určuje výchozí bod, obvykle nejnovější dostupné datum v aktuálním výběru. Tento přístup napodobuje funkce jako TOTALMTD nebo YTD, čímž zajišťuje sladění s kontextem reportingu.
Pokud je maximální datum 31.12.2024, výpočet pokryje období od 1.10.2024 do 31.12.2024 (plné tři měsíce). Pokud je však maximální datum uprostřed měsíce (například 15.12.2024), pokryje období od 16.09.2024 do 15.12.2024, protože DATESINPERIOD pracuje s posuvným intervalem místo celých kalendářních měsíců—pokud to není výslovně řečeno jinak.
SAMEPRIODLASTYEAR
SAMEPERIODLASTYEAR(<dates>)
Vrátí tabulku, která obsahuje sloupec kalendářních dat posunutých o jeden rok zpět od kalendářních dat v zadaném dates sloupci v aktuálním kontextu.
Primárně použito jako filtrační výraz v CALCULATE, SAMEPERIODLASTYEAR je game-changer pokud potřebujete vypočítat existující měru pro stejné období v předchozím roce—ideální pro meziroční (YoY) srovnání.
Například pokud chcete spočítat YoY růst pro MTD, prvním krokem je výpočet MTD hodnoty za minulý rok:
CALCULATE(
[MTD],
SAMEPERIODLASTYEAR('calendar'[Date])
)
SAMEPERIODLASTYEAR zrcadlí kontext vyhodnocení původní měry a jednoduše posune časové rozmezí o rok zpět, což zajišťuje konzistentní porovnání.
PARALLELPERIOD
PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)
Vrátí tabulku, která obsahuje sloupec kalendářních dat, který představuje období paralelně s kalendářními daty v zadaném dates sloupci v aktuálním kontextu, přičemž kalendářní data se posunou o několik intervalů dopředu v čase nebo zpět v čase.
Primárně použito jako filtrační výraz v CALCULATE, PARALLELPERIOD funguje podobně jako SAMEPERIODLASTYEAR, ale umožňuje posunout původní kontext o zadaný interval. Na rozdíl od SAMEPERIODLASTYEAR si zde můžete sami zvolit, o kolik a v jaké jednotce (měsíce, čtvrtletí nebo roky) chcete období posunout. Syntaxe je podobná jako u DATESINPERIOD, takže pracujete s předdefinovanými intervaly.
Například, pro výpočet MTD (Month-to-Date) za předchozí měsíc (MoM porovnání) můžete napsat:
CALCULATE(
[MTD],
PARALLELPERIOD('calendar'[Date], -1, MONTH)
)
Důležitá vsuvka:
Podle dokumentace PARALLELPERIOD vždy vrací celý rozsah posunutého období. To znamená, že pokud posouváte o měsíc, funkce vždy vrátí celý předchozí měsíc, bez ohledu na aktuální výběr data.
Doporučení: Pokud potřebujete porovnat konkrétní období uvnitř měsíce (například od 10. do 21. dne), je lepší použít DATEADD, protože umožňuje přesné posunutí dat při zachování původního výběrového okna.
DATEADD
DATEADD(<dates>,<number_of_intervals>,<interval>)
Vrátí tabulku, která obsahuje sloupec kalendářních dat, posunutý dopředu nebo dozadu o zadaný počet intervalů z kalendářních dat v aktuálním kontextu.
Osobně ji moc nepoužívám, ale protože jsem ji zmínil u PARALLELPERIOD, rozhodl jsem se ji sem zařadit.
Používá se hlavně ve filtračních výrazech CALCULATE a funguje podobně jako PARALLELPERIOD, s jedním klíčovým rozdílem: respektuje neúplné výběry intervalů. To znamená, že pokud vyberete pouze část měsíce, čtvrtletí nebo roku, DATEADD posune právě tento výběr, místo aby vrátila celé předchozí období.
Ostatní důležité funkce
Zde jsou některé důležité zbylé funkce—takové, které se nehodily do žádné konkrétní skupiny, nebo pro které jsem nechtěl vytvářet samostatnou kategorii. Přesto jsou velmi užitečné a určitě stojí za to se je naučit.
SWITCH
SWITCH(<expression>, <value>, <result>[, <value>, <result>]…[, <else>])
Vyhodnotí výraz na seznamu hodnot a vrátí jeden z více možných výsledných výrazů. Tato funkce se dá použít k tomu, abyste se vyhnuli více vnořeným příkazům IF.
Zapomeňte na vnořené IFy—SWITCH vám umožní efektivněji vyhodnocovat více podmínek a vracet různé výsledky podle zmíněných podmínek.
Největší výhodou SWITCH je možnost použít TRUE(), což umožňuje psát více podmínek přehledně a strukturovaně. SWITCH vyhodnocuje podmínky sekvenčně a zastaví se u první, která platí.
To je obzvlášť užitečné pro barevné formátování, označování hodnot nebo dynamickou změnu výpočtů na základě podmínek.
Příklad podmíněného formátování:
SWITCH(TRUE(),
[sales] >= 500, "#0F0",
[sales] >= 250, "#00F",
"#F00"
)
V tomto případě:
Prodeje 500 a více dostanou zelenou (#0F0).
Prodeje 250 a více (ale méně než 500) dostanou modrou (#00F).
Vše pod 250 se nastaví na červenou (#F00).
ISBLANK
ISBLANK(<value>)
Zkontroluje, zda je hodnota prázdná, a vrátí TRUE nebo FALSE.
Skvělý způsob, jak zjistit, zda je hodnota prázdná, a podle toho reagovat. ISBLANK se běžně používá, když potřebujete vracet statické hodnoty (i když to obecně nedoporučuji—ale někdy to prostě nejde jinak).
Jedním z typických scénářů je použití při označování hodnot na základě podmínek. Pokud vracíte statické textové hodnoty bez správného filtrování, mohou se zobrazit napříč všemi řádky, což výrazně zhoršuje výkon. ISBLANK tomu pomáhá zabránit tím, že zajistí, aby se statické hodnoty zobrazovaly pouze pro platné řádky.
Samozřejmě, tohle je jen jeden z mnoha případů, kdy může být ISBLANK užitečná.
IF
IF(<logical_test>, <value_if_true>[, <value_if_false>])
Zkontroluje podmínku a vrátí jednu hodnotu, když je TRUE, jinak vrátí druhou hodnotu.
IF v DAX funguje prakticky stejně jako v Excelu, takže jsem si ani nebyl jistý, jestli ji sem vůbec zařadit—nicméně chci fanklub i od Excel lidí.
Používejte IF pouze tehdy, když potřebujete porovnat jednu hodnotu s výsledkem TRUE/FALSE. Pokud zjistíte, že vnořujete více IF podmínek, je lepší přejít na SWITCH, protože váš kód bude přehlednější a efektivnější.
USERPRINCIPALNAME
USERPRINCIPALNAME()
Vrátí hlavní název uživatele (principal name).
Jediným účelem této funkce je vrátit aktuálního uživatele, který si prohlíží report. Hlavní využití má při implementaci Row-Level Security (RLS), kdy je potřeba dynamicky filtrovat data na základě přihlášeného uživatele.
Běžné nastavení RLS zahrnuje tabulku s e-mailovými adresami, která určuje, ke kterým entitám má každý uživatel přístup. Poté můžete vytvořit relaci k faktové tabulce a definovat RLS pravidlo takto:
[email] = USERPRINCIPALNAME()
Tímto způsobem lze řízení přístupu spravovat na straně Power BI Service přidáním distribuční skupiny obsahující všechny uživatele a publikováním reportu přes appku. Díky tomu lze oprávnění snadno aktualizovat například pomocí souboru na SharePointu (nebo jiného automatizovaného procesu).
BLANK
BLANK()
Vrátí prázdnou hodnotu.
Jednoduchá funkce, často používaná k řízení toho, co se zobrazí, když je potřeba alternativní výsledek. Některé funkce toto řeší automaticky, ale u těch, které ne, je to skvělý způsob, jak vrátit BLANK() místo zahlcení vizuálu zbytečnými výpočty pro řádky, které nejsou v kontextu.
DIVIDE
DIVIDE(<numerator>, <denominator> [,<alternateresult>])
Provede dělení a vrátí alternativní výsledek nebo BLANK() u dělení o 0.
Ano, DIVIDE jednoduše dělí dvě čísla, stejně jako použití "/". Přesto důrazně doporučuji používat DIVIDE, protože elegantně řeší dělení nulou.
Pokud by výpočet vedl k dělení nulou, DIVIDE vrátí BLANK() místo chyby typu NaN. Alternativně můžete pomocí volitelného třetího parametru určit vlastní výsledek pro tyto případy.
MAXX/MINX
MAXX/MINX(<table>,<expression>,[<variant>])
Vrátí nejvyšší/nejnžší hodnotu, která je výsledkem vyhodnocení výrazu pro každý řádek tabulky.
Vím, že jde o iterátory, ale nezařadil jsem je do hlavního seznamu, protože nejsou nezbytné pro každodenní práci s DAXem. Tyto funkce se hodí hlavně pro specifické případy, kdy je potřeba iterovat přes tabulku a najít nejvyšší nebo nejnižší hodnotu.
V některých situacích můžete použít FILTER, abyste nejprve našli relevantní část tabulky, která obsahuje správný kontext, a teprve poté aplikovali MAXX/MINX—i když to není něco, co byste dělali v každém výpočtu.
Běžné použití je například tehdy, když potřebujete předfiltrovat tabulku na základě aktuálního kontextu—například pomocí SELECTEDVALUE—a poté najít nejnižší nebo nejvyšší hodnotu v tomto filtrovaném výběru.
Dalším příkladem je použití VALUES k určení nejvyšší nebo nejnižší hodnoty pro konkrétní agregaci.
Vlídné slovo nakonec
Tak tady to máte—všechny klíčové funkce, které byste se měli naučit. Samozřejmě používám i další funkce, které tu nejsou uvedené, ale tohle je pevný základ pro každého, kdo začíná s DAXem.
Je to taky skvělý způsob, jak si ověřit, jestli už toho znáte dost (i když to předpokládá, že já sám vím dost—což asi nebude pravda! 😆). Pokračujte v učení, uvidíme se příště!
Comments