Funkcia SWITCH patrí medzi najzákladnejšie funkcie jazyka DAX, a je v ňom dostupná už od 2. verzie PowerPivotu, či hneď od začiatku v Power BI. Pre mnohých je však stále novinkou, aj keď som ju používal už v mnohých starších článkoch. Preto sa teraz pozrieme na to, ako si pomocou nej môžete zjednodušiť zápisy podmienok v jazyku DAX.
Na čo je funkcia SWITCH v jazyku DAX
Funkcia SWITCH je skratkovitou funkciou na to, aby ste nemuseli písať mnoho IF-ov. Skratkovitá preto, pretože na pozadí to spraví ona za vás. Pričom nie je žiaden rozdiel v rýchlosti toho, či to zapíšete cez viacero IF-ov alebo cez jeden SWITCH. Je to naozaj iba skrátený, pohodlnejší, a častokrát aj prehľadnejší zápis, ako písať veľa IF-ov. Pre tých, ktorí máte skúsenosti s inými jazykmi, tak je to podobné funkcii/príkazu/klauzule switch v programovacích jazykoch, príkazu CASE v jazyku SQL, či príkazu „Select Case“ vo Visual Basicu, či VBA v excelovských makrách.
Syntax funkcie SWITCH je podľa oficiálnej dokumentácie takáto:
SWITCH(testovanáHodnota; hľadanáHodnota1; výsledok1 [; hľadanáHodnota2; výsledok2; ….] [; defaultVýsledok])
Funkcia SWITCH zoberie hodnotu v 1. parametri testovanáHodnota, a postupne ju porovná voči parametrom s názvom hľadanáHodnotaN. Ak nájde zhodu, tak vráti výsledok zadaný v príslušnom parametri s názvom výsledokN. A ak nenájde žiadnu zhodu, tak vráti buď hodnotu zadanú v parametri defaultVýsledok (ak je zadaná), alebo prázdnu hodnotu (ak ten parameter nie je zadaný). Povinné sú iba prvé 3 parametre. A ak by to našlo viacero zhôd, tak vyhodnocovanie sa ukončí pri nájdení prvej zhody. Respektíve, na pozadí to môže aj nemusí vyhodnotiť všetky „podmienky“, ale vo výsledku sa to správa tak, že to vráti výsledokN nájdený pri prvej zhode.
Príklady pre funkciu SWITCH
Najjednoduchší príklad si ukážeme na našom vzorovom súbore PowerPivotu, resp. Power BI. V tabuľke Čas máme stĺpec MonthName, v ktorom sa nachádzajú anglické názvy mesiacov. Ak by sme ich chceli mať po slovensky, tak existuje viacero riešení. Môžete ju napríklad nahradiť ultimátnou časovou tabuľkou. Prípadne naimportovať číselník s dvoma stĺpcami (v jednom anglický názov, v druhom slovenský), prepojiť s tabuľkou Čas a cez funkciu RELATED si dotiahnuť slovenský názov mesiaca do tabuľky Čas. To by boli celkom fajn riešenia. My si teraz kvôli demonštrácii ukážeme, ako to pôjde spraviť cez vypočítaný stĺpec, cez funkciu SWITCH.
Ak by ste nepoznali funkciu SWITCH, tak by ste napísali asi takýto nejaký vzorec pre vypočítaný stĺpec, ktorý by preložil tie anglické názvy do slovenčiny:
Mesiac = IF ('Čas'[MonthName] = "January"; "január"; IF ('Čas'[MonthName] = "February"; "február"; IF ('Čas'[MonthName] = "March"; "marec"; IF ('Čas'[MonthName] = "April"; "apríl"; IF ('Čas'[MonthName] = "May"; "máj"; IF ('Čas'[MonthName] = "June"; "jún"; IF ('Čas'[MonthName] = "July"; "júl"; IF ('Čas'[MonthName] = "August"; "august"; IF ('Čas'[MonthName] = "September"; "september"; IF ('Čas'[MonthName] = "October"; "október"; IF ( 'Čas'[MonthName] = "November"; "november"; "december" ) ) ) ) ) ) ) ) ) ) )
Je to funkčné, ale sami vidíte, že okrem zdĺhavého zápisu je to aj relatívne zle čitateľné. A to je už po naformátovaní. Keď to však prepíšeme pomocou funkcie SWITCH, tak to už bude vyzerať o dosť lepšie:
Mesiac = SWITCH('Čas'[MonthName]; "January"; "január"; "February"; "február"; "March"; "marec"; "April"; "apríl"; "May"; "máj"; "June"; "jún"; "July"; "júl"; "August"; "august"; "September"; "september"; "October"; "október"; "November"; "november"; "december" )
Takýto zápis je podstatne kratší a čitateľnejší. Testovanou hodnotou je hodnota v stĺpci ‚Čas'[MonthName], ktorá sa postupne porovnáva voči hodnotám „v prvom stĺpci“ tohto naformátovaného zápisu. Ak sa nájde zhoda (napr. pre hodnotu „March“), tak to ako výsledok vráti hodnotu hneď v ďalšom parametri (v tomto prípade „marec“). A ak to nenájde žiadnu zhodu, tak to vráti hodnotu v poslednom parametri s názvom defaultVýsledok, čiže v tomto prípade hodnotu „december“. Mohli by sme síce na konci napísať 2 parametre, „December“ a „december“, ale z povahy dát a logiky to zafungovalo aj takto:
Ako prepísať ľubovoľné IF-y do funkcie SWITCH
Funkciu SWITCH však viete použiť aj na prepis ľubovoľných IF-ov. Zoberme si napríklad jeden z príkladov v staršom článku o základnej kategorizácii hodnôt. Pôvodný príklad s vypočítaným stĺpcom mal takýto nejaký vzorec:
Cenová úroveň = IF ( Produkty[ListPrice] < 100; "nízka cena"; IF ( Produkty[ListPrice] < 1000; "stredná cena"; "vysoká cena" ) )
Tento príklad sa pomocou funkcie SWITCH dá skrátiť takto:
Cenová úroveň = SWITCH(TRUE(); Produkty[ListPrice] < 100; "nízka cena"; Produkty[ListPrice] < 1000; "stredná cena"; "vysoká cena" )
Keďže operácia porovnania v jazyku DAX vráti hodnotu pravda alebo nepravda – ktoré v jazyku DAX vieme vrátiť aj funkciami TRUE() a FALSE() – tak to vieme využiť aj vo funkcii SWITCH. V nej postupne porovnáme, či sa hodnota z funkcie TRUE() rovná výsledku niektorých z tých podmienok. A opäť, ak to nájde zhodu, tak to vráti názov danej úrovne, inak (v tomto prípade, vylučovacou metódou ak ide o najvyššiu úroveň, lebo nie sú splnené všetky podmienky predtým) to vráti názov najvyššej úrovne, ako default výsledok. A týmto viete prepísať ľubovoľnú sadu IF-ov na jeden SWITCH. S bonusom, že to bude oveľa lepšie čitateľné:
Na záver
Takto teda viete použiť funkciu SWITCH. Či už tvoríte vypočítané stĺpce, merítka, alebo dotazy v jazyku DAX. Je to naozaj len syntaktická skratka k tomu, aby ste nemuseli písať viacero IF-ov. A ona to za vás na pozadí „rozpíše“ do tých viacerých IF-ov. V minulosti bol rozdiel v rýchlosti viacerých IF-ov vs. funkcie SWITCH. Dnes tam však už žiaden rozdiel nie je. A je teda zajedno, či to napíšete ako viacero IF-ov alebo len jeden SWITCH. Ak však tých IF-ov máte viacero, tak ich odporúčam prepísať na jeden SWITCH, a naformátovať tak ako je uvedené vyššie. Takto sa potom vo vzorcoch zorientujete oveľa lepšie 🙂
Autor, tréner a expert na PowerPivot, Power BI a jazyk DAX. Založil som tento web, aby som pomohol dostať PowerPivot a Power BI do širšieho povedomia, a aby som ľuďom ukázal, že aj komplexné analytické problémy idú riešiť jednoducho. Po nociach vzývam Majstra Yodu a tajne plánujem ovládnutie vesmíru.