Funkcia COALESCE je konečne aj v jazyku DAX

Do jazyka DAX v Power BI a SSAS Tabulare 2019 pribudla tento mesiac nová funkcia COALESCE. Funkcia, ktorú má každá databáza, ako SQL Server či Oracle, prípadne aj chrastítka ako Access už dlhé desaťročia, prišla do DAX-u až teraz. Spolu s drobným bonusom.

Funkcia COALESCE funguje rovnako ako podľa SQL štandardu. Podľa oficiálnej dokumentácie má takúto syntax:

COALESCE(hodnota1; hodnota2 [; … hodnotaN])

Funkcia má nekonečný počet parametrov, a vráti prvý parameter spomedzi všetkých, ktorý má neprázdnu hodnotou. Parametre sa vyhodnocujú postupne od prvého po posledný, ako pri každej inej funkcii jazyka DAX.

Táto funkcia sa nachádza v každom jednom databázovom systéme, pretože je súčasťou SQL štandardu cca. od 70-tych rokov. Keď ju však ukážete klasickému oraclistovi či inému databázistovi, tak ju zo záhadných dôvodov nepoznajú. V Oracli je totižto duplicitná funkcia NVL, v SQL Serveri NULLIF, a niektoré ďalšie databázy majú svoju variantu. V každom jednom systéme je však aj táto funkcia COALESCE, a keďže je štandardizovaná už od nepamäti, tak by sme ju mali používať tiež. Realita je však iná, a niekedy je to spôsobené jednoduchou neznalosťou, inokedy lenivosťou – jednoducho kvôli tomu, že napísať NVL je kratšie ako COALESCE 😀

A na čo sa prakticky táto funkcia používa?

Ukážeme si to znova na našom vzorovom súbore PowerPivotu, resp. Power BI.

Niekedy potrebujete v jazyku DAX otestovať, či je nejaká hodnota prázdna alebo nie. Ak nie je prázdna, tak chcete vrátiť tú hodnotu, a ak je prázdna, tak chcete vrátiť inú hodnotu. Majme napríklad takúto kontingenčku, kde je zoznam produktov a obratov k nim:

  1. do oblasti riadkov dáme stĺpec ProductName z tabuľky Produkty,
  2. do oblasti hodnôt dáme merítko Obrat z tabuľky Objednávky,
  3. kontingenčku dáme zoradiť od najmenšieho obratu po najväčší,
  4. zapneme zobrazovanie položiek bez údajov.

Výsledná kontingenčka bude vyzerať takto:

Tam vidíte, že niektoré z produktov nemali žiaden obrat. Keby ste si to odscrollovali nižšie, tak tam už budú samozrejme aj produkty s nejakými obratmi.

Teraz by sme potrebovali spraviť to, aby sa pri takýchto produktoch, kde neboli žiadne obraty, zobrazovala nula. Aby sa takéto produkty zobrazovali napr. aj po vypnutí funkcie “zobraziť položky bez údajov”. Keď ešte nebola funkcia COALESCE, tak sa to spravilo napr. takto cez merítko a klasický IF:

Obrat aj nulový := IF([Obrat] <> BLANK(); [Obrat]; 0)

Po dosadení do kontinenčky to bude vyzerať takto:

Jazyk DAX, funkcia COALESCE
Pri hodnote nula to išlo spraviť aj bez IF-u, ale pri iných hodnotách nie. A nevýhodou tohto riešenia bolo to, že vo vzorci sa odkazujeme 2x na hodnotu merítka Obrat, a DAX pri všetkej svojej inteligencii vypočíta toto merítko 2x. Takže to vo výsledku 2x spomalilo štatistiky.

To sa dalo obísť uložením merítka do premennej, a použitím tej premennej vo vzorci:

Obrat aj nulový := 
  VAR obrat = [Obrat]
  RETURN
  IF(obrat <> BLANK(); obrat; 0)

Čo už išlo pôvodnou rýchlosťou, ale bolo to dosť nepohodlné to zakaždým takto ošetrovať.

A ako to ide cez COALESCE?

Po novom to ide cez funkciu COALESCE napísať takto jednoducho:

Obrat aj nulový := COALESCE([Obrat]; 0)

Čo je podstatne jednoduchší zápis ako ten vyššie. Rýchlosťou je to identické s tým posledným zápisom cez premennú, pretože tak podobne je to implementované aj na pozadí. Takže ak ste o tom nevedeli, resp. ste používali vzorce s opakovaním hodnoty, tak odteraz vám pôjde tento istý vzorec 2x rýchlejšie. Ak teda nenarazíte na niektoré zo skrytých pokladov Power BI a DAX-u 🙂

Toto je teda nová funkcia COALESCE a jej prínos. V podstate sa jedná iba o jednoduchý alias k zápisu vyššie. To je ale prípad aj cca. 80% funkcií v jazyku DAX, takže nič nové pod slnkom. Len nám to znova zjednoduší zápis bežných vzorcov. A čím sú veci jednoduchšie, tým lepšie pre nás 🙂