Contact us

Pošlji
povpraševanje

Zakladnica znanja

  • Predzanje

  • Kategorije

September 25, 2020

Prehod konteksta v Power BI

Avtor: Branka Trifunović

V članku je uporabljen Power BI Desktop verzije 2.76.5678.782 (December 2019).

Filterni kontekst, vrstični kontekst in prehod iz vrstičnega v filterni kontekst so najtežje teme pri učenju jezika DAX. Filterni in vrstični kontekst smo si že ogledali v člankih Filterni kontekst v Power BI in Vrstični kontekst v Power BI. V tem članku si bomo ogledali, kako preidemo iz vrstičnega v filterni kontekst.

Ponovimo: filterni in vrstični kontekst

Filterni kontekst je katerokoli filtriranje, ki pride iz vizualizacije v poročilu. Podrobneje so viri filtra lahko:

  1. Vrstice (#1)
  2. Stolpci (#2)
  3. Filtri (#3)
  4. Razčlenjevalniki (#4)

Za vsako polje v matriki se tabele v modelu ustrezno filtrirajo glede na ime stolpca in vrstice ter vse dodatne filtre, npr. vrednosti izbrane v razčlenjevalniku. Filtrirana tabela v modelu se nato agregira v en sam rezultat, ki se zapiše v polje matrike.

Filter deluje na tabele v podatkovnem modelu. Če so tabele povezane, filter potuje v smeri povezave. Pri običajni postavitvi tabel (dimenzijske tabele zgoraj, fact tabela spodaj) filter vedno teče navzdol.

Vrstični kontekst je lastnost kalkuliranih stolpcev in nekaterih funkcij, da se znotraj kalkulacije zavedajo vrstic. Vrstični kontekst pomeni, da funkcija znotraj iteracije potuje skozi vsako vrstico posebej. Za vsako vrstico se ovrednoti vrednost izraza v funkciji, in nato agregira v en končni rezultat.

Vrstični kontekst poznajo:

  • X-funkcije, npr. SUMX(), AVERAGEX()
  • Funkcija FILTER()
  • Kalkulirani stolpci

Za primer si oglejmo uporabo funkcije SUMX.

Funkcija SUMX() ustvari vrstični kontekst v tabeli Sales (#1). Nato iterira skozi tabelo, vrstico za vrstico. V vsaki vrstici vzame vrednosti polja Price (#2) in Tax (#3) in ju sešteje. Na koncu sešteje vsote vseh vrstic v en končni rezultat (#4).

Vrstični kontekst ne ustvari vedno filternega konteksta

Kot smo si že ogledali v članku Vrstični kontekst v Power BI, vrstični kontekst ne ustvari vedno filternega konteksta. Oglejmo si ponovno naslednji primer.

Tabeli Products dodajmo kalkulirano vrstico: TotalSales = SUM(Sales[Value]). Stolpec bo seštel vse vrednosti v polju Value v tabeli Sales. Kakšen rezultat pričakujemo? Bo vrednost za vsak posamezen produkt različna? Odgovor je ne, vrednost je enaka za vse vrstice.

Razlog je v tem, da vrstični kontekst ne ustvari vedno filternega konteksta. Vrednost se res izračuna za vsako vrstico posebej, a posamezni produkt znotraj vrstice ne more filtrirati tabele Sales. Tabela Sales ostane v celoti nefiltrirana in rezultat je za vsako vrstico enak.

Prehod iz vrstičnega v filterni kontekst: CALCULATE()

Pri zgornjem primeru je vseeno možno, da vrstični kontekst vrstice spremenimo v filterni kontekst. To imenujemo context transition oz. prehod konteksta. Vse kar moramo narediti je, da uporabimo funkcijo CALCULATE(). Poskusimo v zgornjo tabelo dodati stolpec, ki bo enak prejšnjemu, le da bomo dodali funkcijo CALCULATE(). Dobimo naslednji rezultat.

Funkcija CALCULATE() »vklopi« filter. V našem primeru to pomeni, da bo zdaj filter iz tabele Products filtriral tabelo Sales glede na produkt v trenutni vrstici in vrnila ustrezen rezultat.

Prehod konteksta obstaja v:

  • X-funkcijah, npr. SUMX(), AVERAGEX()
  • Funkciji FILTER()
  • Kalkuliranih stolpcih

Implicitni CALCULATE() v merah

Znotraj vsake mere se nahaja implicitni CALCULATE(). Oglejmo si kaj to pomeni na primeru. Zgornji tabeli bomo dodali mero z enako formulo, kot smo jo uporabili za stolpec.

1. Z desnim klikom na tabelo Products izberemo New measure.

2. V vnosno polje za formulo vnesemo TotalSales_def = SUM(Sales[Value]).

3. Mero uporabimo v novem stolpcu. Izberemo New Column in vnesemo TotalSales_Measure = [TotalSales_def].

Dobili smo stolpec, ki je identičen stolpcu TotalSales_CALCULATE. Pričakovali bi, da bo stolpec enak stolpcu TotalSales, saj v meri nismo uporabili funkcije CALCULATE(). V resnici pa se CALCULATE() skriva znotraj vsake mere, le vidimo ga ne. Mere torej že vsebujejo funkcijo CALCULATE().

Kazalo