Ak ste niekedy pracovali v jazyku SQL, tak ste už určite miliónkrát použili operátor IN. V PowerPivote tento operátor chýbal, ale zlé časy prešli, a pred mesiacom ho Microsoft konečne pridal aj sem 🙂 Nedostal sa však všade, ale len do najnovšieho PowerPivotu v Power BI a SSAS Tabular 2016. Je tak nový, že v čase písania tohto článku dokonca ešte stále nie je ani v oficiálnej dokumentácii k DAXu… ale funguje 🙂 Náhradné riešenie pre všetky ostatné PowerPivoty nájdete nižšie v tomto článku.
Operátor IN v Power BI a SSAS Tabular 2016+
Pri písaní DAX vzorcov si odteraz môžete zjednodušiť prácu pri vymenovávaní hodnôt rovnako, ako tomu je už dlhé roky v jazyku SQL – jednoducho zadaním podmienky „niečo IN (hodnota1; hodnota2; hodnota3; …)“. Jednotlivé hodnoty sú oddelené bodkočiarkou alebo čiarou, v závislosti od toho, na akom prostredí sa nachádzate (podobne ako sa to používa pre parametre funkcií).
Ak napríklad máte klasickú dátumovú tabuľku, v ktorej chcete vypočítať pre každý deň, či je víkend alebo nie, tak po starom ste museli použiť napr. tento vzorec:
Víkend = IF([DenTýždňa] = „sobota“ || [DenTýždňa] = „nedeľa“; „víkend“; „pracovný deň“)
Po novom je to jednoduchšie:
Víkend = IF([DenTýždňa] IN („sobota“; „nedeľa“); „víkend“; „pracovný deň“)
A keď sa pozriete na aktuálny screenshot tohto vzorca z Power BI, tak zistíte, že samotný Power BI sa tvári, že to nepozná, a podčiarkuje operátor IN ako chybu:
Ale po stlačení Enteru už neprotestuje a vzorec vypočíta 🙂
Aktualizácia 12.4.2017: medzičasom sa operátor IN dostal aj do dokumentácie jazyka DAX. Zmenila sa však mierne syntax, a namiesto okrúhlych zátvoriek za operátorom IN sa už používajú zložené zátvorky. Takže po novom je správna syntax hore uvedeného merítka takáto:
Víkend = IF([DenTýždňa] IN {„sobota“; „nedeľa“}; „víkend“; „pracovný deň“)
Operátor IN v starších PowerPivotoch
Ak teda nepoužívate najnovší PowerPivot, tak Vám zostáva použiť jedno z náhradných riešení. Ako som už spomínal vyššie, tak typicky sa operátor IN musí rozpísať ako N podmienok pomocou operátora OR:
= IF([DenTýždňa] = „sobota“ || [DenTýždňa] = „nedeľa“; „víkend“; „pracovný deň“)
Čo je síce pekné, ale pri väčšom množstve hodnôt sa upíšete k smrti, keď budete musieť napísať 50 podmienok pre 50 hodnôt. Nehovoriac o tom, keď v tom budete musieť spraviť zmenu alebo opraviť chybu… Preto je v takomto prípade lepšie spraviť si osobitnú tabuľku s týmito hodnotami, a mierne upraviť náš vzorec. Naprv teda vyrobíme tabuľku Číselník so stĺpcom Hodnoty, a naplníme ju požadovanými hodnotami, ktoré ideme hľadať. V Exceli môžete na to využiť napr. linkovanú tabuľku, a pripojiť ju do PowerPivotu:
Takúto tabuľku neprepájame na žiadnu inú tabuľku. Ide totiž o parametrickú tabuľku, a takéto tabuľky nemávajú zvyčajne prepojenie na zvyšok dátového modelu.
Následne upravíme náš vzorec nasledovne:
=
IF (
COUNTROWS (
CALCULATETABLE (
VALUES ( ‚Čas'[DenTýždňa] );
FILTER (
ALL ( ‚Čas'[DenTýždňa] );
CONTAINS (
VALUES ( ‚Číselník'[Hodnoty] );
‚Číselník'[Hodnoty]; ‚Čas'[DenTýždňa]
)
)
)
)
> 0;
„víkend“;
„pracovný deň“
)
V tomto vzorci je tabuľka Čas časovou tabuľkou, kde sme počítali aj predtým daný vypočítaný stĺpec, a tabuľka Číselník je číselníkom spomínaným vyššie, ktorý obsahuje hodnoty do simulácie operátora IN v stĺpci Hodnoty. Vzorec je síce podstatne komplikovanejší, ale na druhej strane, dá sa ľahko upraviť aj pre dynamický počet vyhľadávaných hodnôt. A to už za to stojí, precvičiť si trochu DAX a ušetriť si riadny kus práce. Alebo, ak sa Vám to zdá príliš komplikované, tak aspoň budete mať väčšiu motiváciu prejsť na najnovší PowerPivot 🙂 Dovtedy zostáva už len dúfať, že Microsoft pridá operátor IN aj do Excelu 2016.
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.