Měřítka a počítané sloupce v DAX

Úvodní obrázek

Na pozadí Power BI reportů je Tabulární model, do kterého můžeme nahrávat data z mnoha různých zdrojů. Tabulární model můžeme dále programově rozšiřovat o Počítané tabulky, Počítané sloupce, Měřítka a další objekty. V tomto článku si na jednom místě shrneme informace o tom, jaký je rozdíl mezi Počítanými sloupci (Calculated Columns) a Měřítky (Measures).

Rozdíl mezi měřítkem a počítaným sloupcem

Zejména pro tvůrce Power BI reportů, kteří s tímto nástrojem začínají se na první pohled může zdát rozdíl mezi Počítaným sloupcem a Měřítkem malý. V některých případech můžeme dokonce dosáhnout stejného výsledku pomocí obou typů výpočtů. Rozdíly mezi Počítaným sloupcem a Měřítkem jsou ale velké. 

Významu Počítaných sloupců rychle porozumí každý uživatel Excelu nebo vývojář se zkušenostmi s SQL jazykem velmi dobře, protože práce s Počítanými sloupci je velmi podobná tomu jak pracujeme s daty v tabulkách právě v Excelu nebo na SQL serveru. Hlavní výhodou Tabulárního modelu jsou však měřítka. Měřítko v jazyku DAX je totiž revoluční koncept, díky kterému můžeme vytvořit univerzální výpočet, který je použitelný v různých kontextech opakovaně bez nutnosti měnit vzorec v definici měřítka.

Než se dostaneme k hlavním rozdílům mezi těmito dvěma typy výpočtů, můžeme si nejdříve na jednoduchých příkladech ukázat, jak vůbec vytvořit Měřítko, jak vytvořit Počítaný sloupec a jaké jsou výsledky těchto výpočtů. V ukázkách budeme pracovat s Power BI souborem Adventure Works DW 2020.pbix, který je volně dostupný ke stažení na internetu. Tento soubor je také dostupný ke stažení níže pod tímto příspěvkem.

Jak vytvořit v Power BI nový Počítaný sloupec

Počítaný sloupec můžeme vytvořit pouze v již existující tabulce. Nový Počítaný sloupec se po jeho vytvoření stane součástí této tabulky. Následně můžeme Počítaný sloupec používat v reportech, ve výpočtech v Měřítku nebo pro nastavení relací mezi ostatními tabulkami v modelu, úplně stejně jako kterýkoliv nativní sloupec nahraný v modelu.

Jako příklad Počítaného sloupce si můžeme ve cvičném souboru Adventure Works DW 2020.pbix v tabulce 'Product' vytvořit nový Počítaný sloupec s názvem 'Product'[Zisk]. V tabulce 'Product' je pro každý prodávaný výrobek uvedena cena výrobku a náklady na výrobu výrobku. Nový počítaný sloupec bude v každém řádku tabulky počítat rozdíl mezi těmito dvěma hodnotami.

Měřítka a počítané sloupce v DAX 2

Jednou z možností (ne jedinou), jak v Power BI vytvořit nový Počítaný sloupec, je kliknutí pravým tlačítkem myši na tabulku, ve které chceme nový sloupec vytvořit, a v kontextové nabídce vybrat možnost "New column" ("Nový sloupec").  

Měřítka a počítané sloupce v DAX 3

Tím se aktivuje DAX editor nad tabulkou, do kterého můžeme zadat požadovaný výpočet. V tomto příkladu bude DAX vzorec pro výpočet zisku vypadat následovně.

Počítaný sloupec:

Zisk = 'Product'[List Price] - 'Product'[Standard Cost]

Text před znaménkem rovná je název nového počítaného sloupce. Za znaménkem rovná se následuje samotný výpočet, na základě kterého budou dopočítány hodnoty nového Počítaného sloupce v každém řádku tabulky. Vzorec určený pro výpočet nového Počítaného sloupce je vyhodnocen řádek po řádku v kontextu každého řádku tabulky

Měřítka a počítané sloupce v DAX 4

Nový Počítaný sloupec je nyní součástí tabulky. Takto vytvořený sloupec proto zabírá místo v paměti a zvětšuje velikost modelu. Výpočet hodnot v novém sloupci probíhá vždy při vytvoření nového Počítaného sloupce a pak při každé aktualizaci dat v modelu. Název nového sloupce musí být jedinečný v rámci tabulky, ve které je vytvořen.

Poznámka: Technicky existuje rozdíl mezi Počítaným sloupcem vytvořeným v tabulce, která je importována v modelu (Import mode) a mezi Počítaným sloupcem vytvořeným v tabulce, která je v režimu Direct Query. Významově není mezi těmito verzemi žádný rozdíl, jedná se pouze o technický rozdíl. Počítaný sloupec vytvořený v režimu Direct Query je totiž vyhodnocen až v rámci dotazu, který generují vizuály, a není tedy fyzicky součástí modelu, jak je tomu v případě tabulek v režimu Import. Pokud tvoříme Počítaný sloupec v tabulce v režimu Direct Query tak také nemůžeme při jeho definici používat všechny DAX funkce, ale pouze ty funkce, které lze převést do nativního jazyka z pohledu zdroje dat, například do SQL jazyka. V tomto příspěvku se však věnujeme primárně Počítaným sloupcům v tabulkách, které jsou v režimu Import, což je nejčastější způsob práce s tabulkami v Power BI.

Jak vytvořit v Power BI nové Měřítko

Stejně jako Počítaný sloupec, také Měřítko musí být součástí některé z existujících tabulek. Na rozdíl od Počítaného sloupce ale můžeme Měřítka mezi tabulkami libovolně přesouvat, protože Měřítka nejsou závislá na konkrétní tabulce – nejsou vyhodnocena v kontextu řádků určité tabulky. Měřítko je vyhodnoceno až na úrovni reportu v době generování dotazu a je vyhodnoceno v kontextu filtru. Měřítko nezabírá fyzické místo v paměti, ale spotřebovává výpočetní výkon při vykreslování reportu. Nové Měřítko můžeme vytvořit podobně jako Počítaný sloupec. V prvním kroku klikneme pravým tlačítkem na tabulku, ve které chceme nové Měřítko vytvořit. Z kontextové nabídky následně vybereme možnost "New measure" (Nové měřítko).

Měřítka a počítané sloupce v DAX 5

Následně se opět v Power BI aktivuje DAX editor, do kterého můžeme vložit výpočet. Pokud se pokusíme vložit do řádku vzorců stejný výpočet, který jsme použili pro výpočet nového Počítaného sloupce, výsledek bude vypadat následovně.

Měřítka a počítané sloupce v DAX 7

Měřítko nejde vytvořit, protože při vyhodnocení není k dispozici žádný kontext řádku, ve kterém by mohly být odkazy na sloupce vyhodnoceny. Vyřešit tento problém můžeme buď použitím některé z iteračních funkcí, které vytvoří kontext řádku programově, nebo použitím některých sumarizačních funkcí, které agregují hodnoty ze sloupců v kontextu aktivních filtrů. Níže uvedená definice Měřítka je již přípustná.

Měřítko:

(Měřítko) Zisk =
SUMX
(
'Product',
'Product'[List Price] - 'Product'[Standard Cost]
)

Takto vytvořené Měřítko již je platné a můžeme ho použít v reportu. Nově vytvořené měřítko [(Měřítko) Zisk] je sice součástí tabulky 'Product', ale k jeho vyhodnocení dojde až při jeho použití v reportu. Současně můžeme takto vytvořené Měřítko přesunout do kterékoliv tabulky v modelu, a na výsledku výpočtu se nic nezmění. 

Měřítka a počítané sloupce v DAX 8

Měřítko [(Měřítko) Zisk] je v reportu na obrázku výše vyhodnoceno v každém řádku vizuálu Tabulka samostatně, v kontextu filtru dané kategorie. To je zásadní rozdíl oproti Počítanému sloupci. Tabulka ve vizuálech netvoří kontext řádku, jak je tomu u tabulky v modelu a v případě vyhodnocení Počítaných sloupců. Každý řádek v tabulce ve vizuálu, stejně jako například hodnoty zobrazené na osách grafů nebo hodnoty vybrané v průřezech, tvoří kontext filtru, ve kterém je měřítko vyhodnoceno.

Pro představu můžeme například uvažovat druhý řádek vizuálu na obrázku výše. Při vyhodnocení nového Měřítka ve druhém řádku vizuálu Tabulka působí na celý výpočet filtr, který filtruje model pouze na hodnoty odpovídající kategorii produktů "Bikes". Při vyhodnocení Měřítka je nejdříve tabulka 'Product' uvedená v prvním argumentu funkce SUMX() zafiltrována pouze na produkty v kategorii "Bikes". Následně dojde k vyhodnocení výpočtu uvedeného v druhém argumentu funkce SUMX(). Ten je vyhodnocen řádek po řádku v již zafiltrované tabulce 'Product'. Po vyhodnocení výpočtu v každém řádku zafiltrované tabulky 'Product' dojde k sečtení všech hodnot z každého řádku tabulky uvedené v prvním argumentu funkce SUMX(). Tento součet je pak výsledkem měřítka [(Měřítko) Zisk] ve druhém řádku vizuálu Tabulka na obrázku výše. Obdobně je celý výpočet vyhodnocen také pro ostatní kategorie v řádcích vizuálu, a to pouze s tím rozdílem, že v každém řádku vizuálu působí na celý výpočet jiný filtr - jiná kategorie.

Každé měřítko musí vracet skalární hodnotu (jednu hodnotu pro každou jednu buňku použitého vizuálu) a je vyhodnoceno v kontextu filtru. Měřítko je vyhodnoceno v době generování reportu, a spotřebovává proto výpočetní výkon. Výsledky měřítek tedy nejsou součástí modelu a můžeme tak při jejich používání, namísto počítaných sloupců, šetřit paměť a nezvětšovat tak velikost modelu, jako je tomu u počítaných sloupců.

Hlavní rozdíly mezi Počítanými sloupci a Měřítky

  • Měřítko je vyhodnoceno v kontextu filtrů, které obvykle působí v reportu na výpočet z řádků nebo sloupců vizuálů Matice nebo Tabulka, z Průřezů a Grafů nebo z kterýchkoliv jiných vizuálů. Počítaný sloupec je na druhou stranu vyhodnocen v kontextu řádku tabulky, ve které je vytvořen a je součástí této tabulky.
  • Počítaný sloupec je vyhodnocen při jeho vytvoření a následně během každé aktualizace dat v datovém modelu. Měřítko je vyhodnoceno až v době načítání reportu, ve kterém je použito.
  • Hodnoty, které jsou výsledkem Počítaného sloupce jsou součástí tabulky v modelu a zabírají místo v paměti – tzn. zvětšují model. Měřítka nezabírají místo v paměti, ale spotřebovávají výpočetní výkon při načítání reportu.
  • Měřítko může být použito pro vytvoření nového počítaného sloupce. Stejně tak počítaný sloupec může být použit pro výpočty v měřítku.

Kdy použít Měřítko a kdy Počítaný sloupec

V některých případech můžeme použít k dosažení požadovaného výsledku jak Měřítko, tak Počítaný sloupec. V každé situaci ovšem použijeme jiný DAX vzorec, protože měřítko je vyhodnoceno v kontextu filtru, zatímco počítaný sloupec v kontextu řádku.

Pokud s jazykem DAX začínáme, většinou používáme častěji Počítané sloupce, kde je možné postupně vytvářet různé mezivýpočty v tabulkách a tyto mezivýpočty si můžeme snadno zobrazit a následně znovu používat pro dosažení požadovaného výsledku. Po určitém čase a osvojení základních principů jazyka DAX můžeme tvořit efektivně a daleko jednodušeji všechny části výpočtů přímo v Měřítku. Pokud se nám nedaří dostat celou logiku výpočtu do Měřítka, můžeme si u některých složitějších konstrukcí předpočítat část hodnot v počítaném sloupci a tyto hodnoty následně použít jako základ pro výpočet v Měřítku. Tento postup může být za určitých specifických okolností použit také jako jedna z optimalizačních technik, pokud složité výpočty v Měřítcích zpomalují načítání reportů.

Existují ovšem situace, kdy nemáme na výběr, a požadovaného výsledku dosáhneme buď pomocí Měřítek, nebo pouze pomocí Počítaných sloupců.

Obecně lze doporučit použít Počítaný sloupec vždy, pokud chceme:

- vložit výsledek výpočtu do řádků vizuálu Tabulka, na osu Grafů, do sloupců vizuálu Matice atd.,
- vložit výsledek výpočtu do Průřezů, díky kterým může uživatel filtrovat model,
- rozdělit záznamy v tabulce staticky do kategorií, bez ohledu na filtry v reportech,
- vytvořit nové záznamy v tabulce závislé striktně na kontextu řádku, například spojení textových řetězců z různých sloupců apod.

Měřítko bychom měli použít vždy, když chceme:

- manipulovat při výpočtech s filtry, například při počítání procentuálních podílů nebo různých poměrových ukazatelů,
- agregovat hodnoty v rámci kategorií, podkategorií, let, měsíců nebo jiných ukazatelů,
- tvořit dynamické výpočty závislé na filtrech, které uživatel může měnit v reportech,
- manipulovat při výpočtech s relacemi v modelu, například aktivovat neaktivní relace mezi tabulkami nebo měnit směr propagace filtrů mezi tabulkami.  

Shrnutí

Rozhodnutí, zda pro výpočet použít Měřítko nebo Počítaný sloupec, může záviset na mnoha faktorech. V některých případech může být volba jednoznačná a nemáme ani možnost výběru. V některých typech výpočtu můžeme použít také kombinaci obou přístupů, kdy si část výpočtu předpočítáme v Počítaném sloupci, a uložený mezivýpočet použijeme následně v Měřítku. Rozhodnutí o způsobu výpočtu mohou ovlivňovat také další faktory jako jsou velikost modelu, počet jedinečných hodnot ve sloupcích, rychlost načítání reportu nebo složitost výpočtu a čitelnost a udržovatelnost DAX kódu. Obecně jsou ale měřítka hlavní výhodou a silnou stránkou, kterou máme k dispozici při rozšiřovaní Tabulárního modelu o vlastní výpočty, především díky jejich univerzální použitelnosti a možnosti opakovaně používat měřítka v různých kontextech, které si uživatel reportu může také sám měnit, například pomocí Průřezů. Kontext vyhodnocení pak může měnit také autor reportu programově, například pomocí funkce CALCULATE()

Některé praktické příklady s použitím jak Měřítek, tak Počítaných sloupců může najít na stránce DAX příklady nebo na stránce Power BI. Video návody k jazyku DAX jsou pak dostupné na Youtubovém kanále pod tímto odkazem.

č. 26

Komentáře