DAX ali kaj se skriva za izračuni v Power BI | Power BI triki
DAX ali kaj se skriva za izračuni v Power BI | Power BI triki
Tokrat bomo začeli na malce drugačen način in sicer z napačnimi trditvami oz. idejami, ki se pojavljajo, ko ljudje začnejo spoznavati DAX.
-
»DAX je programski jezik.« Ne drži.
DAX se je začel kot funkcijski jezik (functional language), danes pa mu pravimo poizvedbeni jezik (query language), ki je namenjen za delo z relacijskimi podatki in omogoča dinamične agregacije. Ko govorimo o relacijskih podatkih, govorimo o tabelarični podatkovni bazi (tabular database), kjer so tabele med seboj povezane z relacijami. -
»DAX se uporablja samo v PowerBI.« Ne drži.
DAX je Microsoftov produkt, ki se uporablja v Excelovem dodatku Power Pivot, platformi Power BI in SSAS-u (SQL Server Analysis Services). -
»DAX je isti kot formule v Excelu.« Deloma drži.
V kolikor se nahajamo v Excelovemu dodatku Power Pivot so formule spisane v jeziku DAX, medtem ko formule znotraj osnovnega Excela niso. Kot že omenjeno je DAX jezik, ki zna delati z relacijskimi bazami, kar pomeni, da razume povezave med tabelami in zna črpati stvari tudi iz drugih tabel, če so le-te med seboj ustrezno povezane. Za tiste, ki morda ne veste, Power Pivot je dodatek v Excelu, ki nam omogoča, da uvozimo več tabel in jih ustrezno povežemo ter na njih izvajamo izračune. Od tod potreba po DAX-u, ki take izračune omogoča.
DAX se uporablja za t. i. izračunljiva polja (calculated fields), torej izračunljive stolpce (calculated columns) in mere (measures). V grobem rečeno, DAX računa s stolpci, kar pomeni, da če želimo vsoto prometa, mu povemo, da želimo vsoto stolpca z naslovom promet ( SUM(Tabela1[Promet]). Zadeva izgleda precej podobno kot v Excelu, vendar kar hitro pridemo do primera, kjer se zadeve oddaljijo od preprostih formul v Excelu.
Ko sem sam začel s spoznavanjem DAXA, se je kar hitro pojavila potreba, da izračunam vsoto na podlagi pogoja. Seveda sem brez vsakega dvoma začel pisati mero in uporabil funkcijo SUMIF ter hitro ugotovil, da v DAX-ovi knjižnici ne obstaja. Takrat sem se prvič spoznal s tako imenovanimi konteksti vrednotenja (Evaluation context), ki so posebnost DAX jezika. Mednje sodita t.i. filter context in row context, vendar se z njima še ne bomo ukvarjali, saj so to zahtevnejše tematike, ki potrebujejo svojo novico. :)
Vrnimo se nazaj k osnovnemu DAX-u in preprostim formulam s katerimi začnemo, ko začnemo spoznavati omenjeni funkcijski jezik. Prva stvar, ki si jo je potrebno pogledati je sintaksa formul. Sintaksa vsebuje številne elemente, ki sestavljajo formulo oz. bi sintaksi lahko rekli kar pravilo, kako je formula napisana.
Slika 1: Sintaksa formule € Prodaja.
Formula torej vsebuje naslednje člene:
A – Ime izračunljivega polja.
B – Enačaj po imenu označuje, da bomo začeli s pisanjem dejanske formule. Potrebno je opozoriti, da je v okolju Power BI dovolj le enačaj, medtem ko moramo v Power Pivot-u in SSAS-u pred enačaj dodati dvopičje ( := ), da bo formula sploh delovala.
C – Funkcija, ki smo jo uporabili, v našem primeru je to vsota.
D - Argumenti funkcije SUM, ki so zajeti v oklepajih. Namreč, po imenu funkcije argumente vedno ujamemo v oklepaje, tudi če argumenta ni.
E – Ime tabele v kateri se nahaja stolpec, katerega vsoto računamo.
F – Ime stolpca, na katerega se sklicujemo in katerega vsoto računamo.
Vidimo, da sama sintaksa mere res spominja na Excelove formule in tudi beremo jih na podoben način (vsaj osnovne): Izračun € Prodaja izračunaj kot vsoto stolpca Prodaja_NETO_eur, ki se nahaja v tabeli Prodaja.
Formula za prodajo, ki smo jo prej prikazali se v resnici imenuje mera. DAX nam omogoča, da računamo z že pripravljenimi izračuni (merami). Poglejmo si še en primer za izračun dobička.
Slika 2: Primer računanja z merami.
Vidimo, da je sintaksa malce drugačna kot prej, vendar vseeno preprosto berljiva. Naša mera dobiček se izračuna kot razlika med prodajo in vsemi stroški. Poudariti je potrebno, da pri imenih mer ni predhodno povedano v kateri tabeli je mera spravljena. Ali je mera sploh spravljena v tabeli? Ja in ne. Ker je mera izračun, ki nam vrne le eno vrednost, obstaja nekje v tabeli, saj jo moramo nekam odložiti, vendar je ne vidimo, če pogledamo tabelo samo. Sam si rad predstavljam, da ima tabela en poseben predal, ki je očem skrit in vanj shranjuje vse izračune, ki so izvedeni na nekem stolpcu omenjene tabele. Naj vas pa to ne zavede. Mere so lahko spravljene tudi v »skritih predalčkih« drugih tabel, čeprav uporabljajo stolpce oz. podatke iz tabel, kjer niso shranjene. Se še spomnite, ko sem omenjal relacijski model? Tabele so med seboj povezane in mera zna iti po povezavi ter poiskati zahtevane podatke.
Kljub vsemu, pa lahko tudi mere obogatimo z imenom tabele v kateri je shranjena.
Slika 3: Primer računanja z merami, kjer imamo pri imenih mer tudi ime tabele.
Izračuna na sliki 2 in sliki 3 sta popolnoma enaka. Velja nenapisano pravilo, da pri imenih osnovnih stolpcev in izračunljivih stolpcev uporabimo ime tabele (je celo zahtevano), medtem ko pri merah ime tabele spustimo (kot prikazuje slika 3). Tako hitreje ločimo med stolpci in merami kar pomeni, da hitreje razumemo sintakso formule.
Preden zaključim bi se rad vrnil na svoj problem s SUMIF-om, saj vam dolgujem odgovor. No, vsaj tistim najbolj radovednim. Kot omenjeno, SUMIF v DAX jeziku ne obstaja in v ta namen, se uporabi naprednejša funkcija CALCULATE, ki promovira filter context.
Slika 4: Vsota na podlagi pogoja - Prodaja enote B.
Tudi funkcija CALCULATE sodi med zahtevnejše tematike in si zasluži svojo novico, zato se v zgornjo sintakso ne bomo spuščali.
Čeprav DAX izgleda precej zahteven in unikaten zaradi kontekstov vrednotenja, je za osnovno uporabo precej preprost. Nekako bi nanj apliciral Paretovo načelo 80/20. Za 80% znanja boste potrebovali 20% časa, medtem ko za zadnjih 20% znanja pa preostalih 80% časa. Se vam zdi DAX zanimiv? Vabimo vas na BI akademijo I in II kjer se boste spoznali z osnovnimi in zahtevnejšimi DAX izračuni.
Avtor: Martin Korytowski