Operátor IN v PowerPivote

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:

ppivot_operator_in

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:

ppivot_operator_in_2

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.