Indický zápis filtrov cez viaceré stĺpce súčasne už funguje v jazyku DAX!

Indický zápis filtrov je veľmi často používaná technika v jazyku DAX na výpočet filtrovaných ukazovateľov. V pôvodnom článku o indickom zápise filtrov v jazyku DAX som spomínal jedno z obmedzení tohto zápisu – že musí byť vyhodnotiteľný v rámci 1 stĺpca. Od marcového vydania Power BI Desktopu a príslušnej verzie SSAS Tabularu 2019 tam už toto obmedzenie konečne nie je. A po novom funguje aj indický zápis filtrov cez viaceré stĺpce. Síce iba čiastočne, ale predsa. A preto sa teraz na to pozrieme, čo ide a čo nejde po novom spraviť.

Na demonštráciu tejto techniky filtrovania opäť využijeme náš vzorový súbor PowerPivotu, resp. Power BI.

Spravíme si kontingenčku, kde:

  1. do oblasti hodnôt dáme merítko Obrat z tabuľky Objednávky,
  2. do oblasti riadkov dáme stĺpce CalendarYear z tabuľky Čas.

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

A keď sme teraz chceli využiť indický zápis filtrov a vypočítať Obrat iba za USA, tak sme vytvorili takéto merítko:

Obrat za USA := CALCULATE( [Obrat] ; 'Regióny'[Krajina] = "United States")

Výsledok vyzeral nejak takto:

Indický zápis filtrov cez viaceré stĺpce - začiatok cez 1 stĺpec

Zložená podmienka v indickom zápise filtrov

Keď sme potom chceli zadať zloženú podmienku, napr. že sme chceli vypočítať Obrat za USA a Nemecko súčasne, tak to ešte išlo, napríklad cez takéto merítko:

Obrat za USA a Nemecko := 
CALCULATE( [Obrat] ; 
           'Regióny'[Krajina] = "United States" || 'Regióny'[Krajina] = "Germany")

A výsledok bol takýto:

Išlo to, pretože podmienka bola vyhodnotiteľná v rámci stĺpca ‘Regióny'[Krajina]. Takže DAX s tým nemal problém.

Indický zápis filtrov cez viaceré stĺpce

Čo však v prípade, ak by sme chceli zadať indický zápis filtrov cez viaceré stĺpce? Napríklad, chceli by sme vypočítať Obrat len za región “Central” v USA? Môžeme to skúsiť napísať v merítku takouto podmienkou:

Obrat za central USA := 
CALCULATE( [Obrat] ; 
           'Regióny'[Krajina] = "United States" && 'Regióny'[Region] = "Central")

Ak máte staršie vydanie Power BI Desktopu ako “Marec 2021”, tak vám to vyhodí nasledovnú chybovú hlášku:

Indický zápis filtrov cez viaceré stĺpce - chyba

V najnovšom Power BI Desktope to však už bez problémov prejde a zobrazí takýto výsledok:

Ak by ste to chceli spraviť v starších verziách Power BI Desktopu, excelovského PowerPivotu či SSAS Tabularu, tak riešenie by v tomto prípade bolo zadať to ako 2 indické zápisy filtrov do CALCULATE:

Obrat za central USA := 
CALCULATE( [Obrat] ; 
           'Regióny'[Krajina] = "United States" ; 
           'Regióny'[Region] = "Central")

Čo však v prípade, že by sme chceli použiť v pôvodnom zápise operátor “alebo” namiesto “a súčasne” (aj keď to nedáva v tomto prípade moc zmysel)? Po novom nie je problém zadať ani to:

Obrat za central alebo USA := 
CALCULATE( [Obrat] ; 
           'Regióny'[Krajina] = "United States" || 'Regióny'[Region] = "Central")

Ak ste to však chceli spraviť v starších verziách čohokoľvek s PowerPivotom (Power BI Desktop, excelovský PowerPivot, SSAS Tabular, AAS, …), tak to samozrejme už neprešlo, s rovnakou chybovou hláškou. A muselo sa to ošetriť napríklad takýmto zápisom:

Obrat za central alebo USA := 
CALCULATE( [Obrat] ; 
           FILTER(ALL('Regióny'[Krajina]; 'Regióny'[Region]); 
                  'Regióny'[Krajina] = "United States"
                  || 'Regióny'[Region] = "Central") )

Takýto zápis už prešiel aj tam. Nebolo to ideálne, ale išlo to.

Funguje to aj pre rôzne tabuľky?

Keď som však prvýkrát videl, že už nemáme toto obmedzenie, tak som to podrobil ďalším testom. Čo tak vyskúšať to cez stĺpce vo viacerých tabuľkách? Tam to už také jednoduché nebude, najmä ak v jednotlivých častiach podmienky nepoužívate operátor “a súčasne”, pri ktorom by ste to vyriešili rozdelením na samostatné indické zápisy filtrov.

Zoberme si príklad z ďalšieho staršieho článku, kde som písal, ako použiť v podmienke “alebo” cez viacero tabuliek. Tam sme chceli vypočítať Obrat za objednávky, ktoré boli uskutočnené v USA, alebo v ktorých boli modré produkty. Výsledný vzorec bol takýto – bez použitia indického zápisu filtrov:

Obrat za USA alebo modre produkty := 
CALCULATE( [Obrat] ; 
           FILTER('Objednávky'; 
                  RELATED('Regióny'[Krajina]) = "United States" 
                  || RELATED(Produkty[Color]) = "Blue") )

Výsledok vyzeral nejak takto:

A teraz otázka – išlo by to zapísať aj “skrátene”, s použitím indického zápisu filtrov, ktorý po novom dovoľuje zapísať podmienku aj cez viacero stĺpcov? Vyskúšame teda napísať takéto merítko:

Obrat za USA alebo modre produkty 2 := 
CALCULATE( [Obrat] ; 
           'Regióny'[Krajina] = "United States" || Produkty[Color] = "Blue" )

Keď vyskúšame vytvoriť takéto merítko, tak smola – dostaneme takúto chybovú hlášku (z nejakého dôvodu po anglicky aj v slovenskej verzii Power BI Desktopu – ešte to asi nestihli preložiť):

Indický zápis filtrov cez viaceré stĺpce - chyba pri viacerých tabuľkách

Takže nie je to až také ružové, a táto novinka funguje len vtedy, ak všetky stĺpce v indickom zápise filtrov pochádzajú z jednej tabuľky. Ale aj tak to poteší.

A ako rozchodiť indický zápis filtrov cez viaceré stĺpce v rôznych tabuľkách?

Keby sme použili zápis cez FILTER a ALL, tak ako na začiatku tohto článku, tak to znova nepôjde, pretože aj pri funkcii ALL musia pochádzať všetky stĺpce z tej istej tabuľky. Preto na to budeme musieť ísť inak.

Zafunguje napríklad takýto zápis:

Obrat za USA alebo modre produkty 2 :=
CALCULATE (
    [Obrat];
    FILTER (
        CALCULATETABLE (
            SUMMARIZE ( 'Objednávky'; 'Regióny'[Krajina]; Produkty[Color] );
            ALL ( 'Regióny'[Krajina] );
            ALL ( Produkty[Color] )
        );
        'Regióny'[Krajina] = "United States" || Produkty[Color] = "Blue"
    )
)

Riešení je viacero, a zafunguje napríklad aj toto:

Obrat za USA alebo modre produkty 2 :=
CALCULATE (
    [Obrat];
    FILTER (
        CROSSJOIN( ALL ( 'Regióny'[Krajina] ); ALL ( Produkty[Color] ) );
        'Regióny'[Krajina] = "United States" || Produkty[Color] = "Blue"
    )
)

Nie je to síce pekné, ale funguje to rovnako, ako keby zafungoval indický zápis filtrov cez tie 2 stĺpce. A to je podstatné:

Indický zápis filtrov cez viaceré stĺpce - fungujúci pre viaceré tabuľky

Na záver

Takže takto sa dá rozbehať indický zápis filtrov aj cez viaceré stĺpce. Ak máte možnosť použiť ten nový zápis – čiže ak sú všetky stĺpce v podmienkach z tej istej tabuľky – tak môžete použiť indický zápis filtrov a zapísať svoju zloženú podmienku jednoducho pomocou jedného indického zápisu filtrov. Ak sú však už stĺpce z viacerých tabuliek, tak sa inšpirujte napríklad niektorým z hore uvedených alternatívnych riešení, dokým to tam za ďalších 10 rokov nedorobia tiež. Takto Vám indický zápis filtrov cez viaceré stĺpce zafunguje za každých podmienok 🙂