Kako deluje kraljica DAX funkcij? | BI trik

Kako deluje kraljica DAX funkcij? | BI trik

26. 03. 2020 Poslovna analitika, B2

DAX jezik uporabljajo Power BI, Power Pivot in SQL Server Analysis Services (tabularni model). Zahtevni a zelo uporabni funkciji, ki ju DAX ponuja, sta CALCULATE in CALCULATETABLE. Da ju bomo s pridom uporabljali, je dovolj, da podrobno spoznamo, kako deluje funkcija CALCULATE.

Sintaksa

Funkcija CALCULATE računa določeno vrednost upoštevajoč določene filtre. Njena sintaksa je sledeča

CALCULATE(<izraz>;<filter1>;<filter2>…)

 

Pri tem so njeni parametri sledeči

<izraz> izračun za evalvacijo,

<filter1>;<filter2>;… (opcijsko) seznam logičnih izrazov ali izrazov, ki vsebujejo določene filtre na neki tabeli.

Uporaba

Rabo funkcije CALCULATE si oglejmo na konkretnem primeru. Z wikipedije smo uvozili podatke o trenutno aktualni pandemiji koronavirusne bolezni in jih shranili v tabelo Coronavirus pandemic.

power bi

Zapišimo osnovni izračun za skupno število vseh primerov. Ta vrne rezultat 470.513.

Number of Cases = SUM('Coronavirus pandemic'[Cases])

dax, power bi

Sedaj se lahko posvetimo funkciji CALCULATE. Večina funkcij v DAX-u evalvira svoje parametre enega za drugim od leve proti desni: oceni se prvi parameter, nato drugi, tretji itn. Pri funkciji CALCULATE (in tudi CALCULATETABLE) pa temu ni tako. Pri njej se prvi parameter evalvira šele za tem, ko so evalvirani vsi drugi. Poglejmo na konkretnem primeru.

Denimo, da nas zanima število primerov koronavirusne bolezni posebej v Italiji in posebej v Sloveniji.

powerbi

V izračunih s pridom uporabimo izračun, ki smo ga definirali zgoraj. Zapišimo izračuna.

Number of Cases in Italy = CALCULATE(
    [Number of Cases];
    'Coronavirus pandemic'[Locations]="Italy"
)
Number of Cases in Slovenia = CALCULATE(
    [Number of Cases];
    'Coronavirus pandemic'[Locations]="Slovenia"
)

 

Osredotočimo se na izračun števila potrjenih primerov v Sloveniji. Najprej se tabela Coronavirus pandemic pofiltrira in sicer, na stolpcu Locations so ustrezni vnosi le tisti, kjer je zapis enak Slovenia. Nato se na filtrirani tabeli izvede izračun Number of cases. Tako Number of Cases in Slovenia vrne rezultat 528.

Kar smo opisali zgoraj, je relativno preprosto. Kaj pa če imamo znotraj CALCULATE gnezden še en CALCULATE? Zapišimo izračuna in si oglejmo vrstni red izvajanja.

Order 1 = CALCULATE(
    CALCULATE(
        [Number of Cases];
        'Coronavirus pandemic'[Locations]="Slovenia"
    );
    ALL('Coronavirus pandemic'[Locations])
)
Order 2 = CALCULATE(
    CALCULATE(
        [Number of Cases];
        ALL('Coronavirus pandemic'[Locations])
    );
    'Coronavirus pandemic'[Locations]="Slovenia"
)

 

V izračunu Order 1 se najprej izvede operacija ALL('Coronavirus pandemic'[Locations]) – to se zgodi še preden se izvede notranji CALCULATE. Funkcija ALL tako odstrani vse obstoječe filtre s stolpca Locations v tabeli Coronavirus pandemic. Nato se prične izvajanje notranjega klica CALCULATE, ki najprej filtrira isti stolpec na vnose, ki so enaki Slovenia. Izračun Order 1 tako vrne iste vrednosti kot izračun Number of Cases in Slovenia.

power bi dashboard

Poglejmo še drugi primer, tj. izračun Order 2. Najprej se izvede zunanji filter, torej se tabela filtrira le na lokacijo Slovenia. Nato se izvede filter, ki je zapisan v notranjem klicu CALCULATE, tj. funkcija ALL odstrani vse morebitne filtre na lokacijah. Posledično izračun vrne iste vrednosti kot izračun Number of Cases v primeru, da ni izbran noben drug filter. Spodnja slika prikazuje, kaj vrnejo definirani izračuni, če imamo izbran zunanji filter za lokacijo Spain. Po pričakovanjih se na spremembo filtra odzove le izračun Number of cases.

power bi dashboard

Izbiro filtra na poročilu si lahko pravzaprav predstavljamo kot CALCULATE(<izraz>;<izbrani filter na poročilu>). To pojasni, zakaj se spodnji štirje izračuni s slike ne spremenijo ob spremembi filtra Locations (na desni strani) iz (All) na Spain.

Ena izmed zanimivih funkcij, ki bi si jo lahko ogledali v tem kontekstu je tudi funkcija KEEPFILTERS, ki semantično vpliva na izvajanje funkcij CALCULATE in CALCULATETABLE. Kaj pa moramo vendarle pustiti še za prihodnje novičke, kajne?

B2 BI ekipa vam želi obilico zdravja in potrpežljivosti. Skupaj poskrbimo, da čas, v katerem smo se znašli, med drugim izkoristimo za množenje znanja. Mi ga množimo tako, da ga delimo med vas.

Avtor: Neža Dimec, mag. mat.

 

Nazaj