DAX funkcije za generisanje tabela

DAX je iskazni jezik koji dolazi u nekoliko „ukusa“. Iako su većina funkcija raspoložive za Excel, Power BI i SQL Server Analysis Services postoje neke od njih koje su specifične za pojedine platforme. Pošto Power BI poseduje mogućnost generisanja tabela a postoje DAX funkcije koje, kao rezultat, vraćaju tabele u ovom tekstu ćemo se pozabaviti nekima od njih koje se mogu iskoristiti samo u Power BI DAX izrazima, ne i u Excel-u.

Pokrenuli smo Power BI Desktop. Nakon što uvezemo i povežemo nekoliko tabela, novu možemo da napravimo ulaskom u Data View, a zatim izborom Modeling ribona i opcije New Table. Upisaćemo naziv nove tabele, a zatim izraz na osnovu koga se ona kreira. Hajde da vidimo koje sve funkcije za generisanje tabela postoje i kako se one koriste!

ADDCOLUMNS(<tabela>;<naziv>;<izraz>[;<naziv>;<izraz]…) 

ADDCOLUMS je DAX funkcija koja dodaje kolone postojećoj tableli. Rezultat je postojeća tabela proširena za dodate kolone. Npr. ako imamo tabelu Transakcije koja se sastoji od kolona ID-TRA, DATUM, ID-OBJ, ID-ART i KOL, a želimo da dodamo sumu i prosek svih prodatih količina napisali bismo izraz:

Transakcije2 = ADDCOLUMNS(Transakcije;”Suma količina”;SUM(Transakcije[KOL]);”Prosek količina”;AVERAGE(Transakcije[KOL]))

GROUPBY (<tabela>;[<groupBy_kolona1>…], [<naziv>, <izraz>]… )

GROUPBY je DAX funkcija koja vraća kao rezultat tabelu koja je nastala tako što smo iz neke druge tabele izabrali jednu ili više kolona po kojima vršimo grupisanje, a zatim dodali izraz kojim se vrši agregacija podataka. Pre izraza je obavezno navesti naziv, što je ustvari kratak tekstualni opis kolone nad kojom je izvršena agregacija. Za računanje izraza koristimo neku „X“ funkciju gde kao prvi parametar navodimo funkciju CURRENTGROUP() koja ukazuje na to da se agregacija vrši nad podacima iz tekuće grupe. Npr. za izračunavanje prosečne cene po klasifikaciji i artiklima potrebno je napisati sledeći izraz:

Prosečna cena KL-ART = GROUPBY(Artikli;Artikli[KLASIFIKACIJA];Artikli[NAZIV ARTIKLA];
“Prosečna cena”;AVERAGEX(CURRENTGROUP();Artikli[PC]))

Na koji način bismo dobili sličnu tabelu u kojoj je izvršeno grupisanje samo za one artikle kod kojih je KLASIFIKACIJA=“JOGURT“? Pa samo umesto prvog argumenta, što je naziv tabele, treba navesti FILTER funkciju koja vraća filtriranu tabelu za zadatu klasifikaciju:

Prosečna cena KL-ART-JOGURTI = GROUPBY(FILTER(Artikli;Artikli[KLASIFIKACIJA]=”JOGURT”);Artikli[KLASIFIKACIJA];
Artikli[NAZIV ARTIKLA];”Prosečna cena”;AVERAGEX(CURRENTGROUP();Artikli[PC]))

SUMMARIZE(<tabela>, <groupBy_kolona>[, <groupBy_kolona>]…[, <naziv>, <izraz>]…) 

SUMMARIZE je DAX funkcija koja vraća tabelu, a sastoji se iz više kolona po kojima se vrši grupisanje (mogu da budu i iz različitih tabela koje smo prethodno povezali u modelu), a prikazuje jedan ili više rezultata do kojih se dolazi izračunavanjem izraza. Slično kao kod funkcije GROUPBY pre izraza je potrebno navesti naziv koji ga opisuje. SUMMARIZE je jako liberalna funkcija jer za računanje iskaza možemo da iskoristimo različite funkcije. Npr. ako želimo da iskoristimo SUM funkciju za računanje sume količina po nazivima artikla napisali bismo iskaz:

Suma Količina SUM = SUMMARIZE(Transakcije;Artikli[NAZIV ARTIKLA]; “Suma količina”; SUM(Transakcije[KOL]))

Ako želimo, možemo da iskoristimo i neku „X“ funkciju, npr. SUMX:

Suma Količina SUM = SUMMARIZE(Transakcije;Artikli[NAZIV ARTIKLA]; “Suma količina”; SUM(Transakcije[KOL]))

A možemo i da iskoristimo, svima omiljenu, funkciju CALCULATE:

Suma Količina CALCULATE = SUMMARIZE(Transakcije;Artikli[NAZIV ARTIKLA]; “Suma količina”; CALCULATE(SUM(Transakcije[KOL])))

Što bi rekla stara starogradska pesma:“Evo srcu mom radosti“! Da li razumete o čemu govorim?

SUMMARIZECOLUMNS (<groupBy_kolona> [; < groupBy_kolona >]…; [<filter_tabela>]…
[; <naziv>; <izraz>]…) 

 SUMMARIZECOLUMNS je funkcija koja radi slično kao SUMMARIZE s tim što najpre navodimo kolonu, pa zatim tabelu, naziv i na kraju izraz. Kao i u puno prethodnih slučajeva, kada birate koju ćete DAX funkciju da iskoristite, sve je stvar stila. Npr. ako želimo da izračunamo prosečnu cenu jogurta, samo za vrednost klasifikacije „JOGURTI“ napisali bismo iskaz:

Suma Količina SC = SUMMARIZECOLUMNS(Artikli[KLASIFIKACIJA];FILTER(Artikli;Artikli[KLASIFIKACIJA]=”JOGURT”);
“Prosečna cena jogurta”;AVERAGE(Artikli[PC]))