Ugrás a fő tartalomra

Power BI DAX alapok CALCULATE() függvény

Power BI DAX alapok CALCULATE() függvény 



A CALCULATE() a DAX egyik legfontosabb és legerősebb függvénye, amely lehetővé teszi, hogy egy adott kifejezés kiértékelésének környezetét módosítsuk. Ez azt jelenti, hogy a függvény képes új szűrőket bevezetni, meglévőket módosítani vagy törölni az aktuális szűrőkörnyezetből.

 A CALCULATE() azonban több táblán is működhet. A CALCULATE() függvény használatakor először alkalmazza a szűrőket a releváns táblákra, majd újraindítja a szűrőterjesztő motort, és gondoskodik arról, hogy a CALCULATE() függvényen belüli új szűrők automatikusan az „egy” oldalról terjedjenek. a „sok”  oldalhoz való viszony (azaz a szűrők lefelé folynak) a kifejezés kiértékelése előtt. Tehát alkalmazhat egy szűrőt egy vagy több keresési táblára, és ezek a szűrők tovább fognak terjedni az adattáblákra, és minden kifejezés, amely a csatlakoztatott adattáblákon keresztül kiértékelődik, tükrözi a keresési táblák szűrőit.



CALCULATE() Szintaxis

DAX
CALCULATE(<kifejezés>, <szűrő1>, <szűrő2>, ...)

🔹 <kifejezés> – Az az aggregált kifejezés, amelyet ki akarunk számítani.
🔹 <szűrő1>, <szűrő2>, ... – Egy vagy több szűrőfeltétel, amelyek módosítják az aktuális szűrőkörnyezetet.


CALCULATE() működése: Szűrőkörnyezet módosítása

A CALCULATE() háromféleképpen képes módosítani a szűrőkörnyezetet:

  1. Új szűrőt ad hozzá: Korlátozza az adathalmazt egy adott feltétel alapján.
  2. Felülírja a meglévő szűrőket: Ha egy szűrő már létezik, azt a függvény felülírja.
  3. Eltávolítja a meglévő szűrőket: Meghatározott szűrőket teljesen törölhet (pl. REMOVEFILTERS() használatával).

Példák és magyarázatok

1️⃣ Új szűrő hozzáadása

Tegyük fel, hogy van egy 'Sales' tábla, amely a következő oszlopokat tartalmazza:

ProductQuantityPriceSalesAmount
A2100200
B3150450
C1200200
A4100400

Ha szeretnénk kiszámolni az összes eladást csak az A termékre, akkor a következőképpen használhatjuk a CALCULATE() függvényt:

DAX
SalesForA = CALCULATE(SUM(Sales[SalesAmount]), Sales[Product] = "A")

🔹 Működés:

  • A teljes eladási értéket (SUM(Sales[SalesAmount])) számolja ki.
  • Csak azokat a sorokat tartja meg, ahol Sales[Product] = "A".

Eredmény:
👉 (200 + 400) = 600


2️⃣ Meglévő szűrők felülírása

Tegyük fel, hogy van egy vizuális elem a Power BI jelentésünkben, amely az összes termék eladásait mutatja. Ha egy szeletelővel (Slicer) vagy egy diagrammal kiválasztunk egy adott terméket, akkor az összegző értékek automatikusan módosulnak.
De mi van, ha mindig az A termék eladásait akarjuk látni, függetlenül a vizualizációs szűrőktől?

---DAX

SalesAlwaysA = CALCULATE( SUM(Sales[SalesAmount]), ALL(Sales[Product]) )

🔹 Működés:

  • Az ALL() függvény eltávolítja az oszlopra (Sales[Product]) vonatkozó szűrőket.
  • Így a vizualizációs szeletelők vagy diagramok nem befolyásolják az eredményt.
  • Az eredmény mindig a teljes SUM(Sales[SalesAmount]) lesz.

3️⃣ Szűrők eltávolítása

Tegyük fel, hogy van egy kimutatás (Matrix) Power BI-ban, amely az eladásokat termékek szerint mutatja. Ha szeretnénk egy olyan oszlopot, amely mindig az összesített értékeket mutatja, függetlenül a termékszűrőktől, akkor használhatjuk a REMOVEFILTERS() függvényt:

---DAX

TotalSalesAllProducts = CALCULATE( SUM(Sales[SalesAmount]), REMOVEFILTERS(Sales[Product]) )

🔹 Működés:

  • A REMOVEFILTERS(Sales[Product]) eltávolítja az oszlopra vonatkozó szűrőket.
  • Így minden termék esetében az összesített érték jelenik meg.

További haladó példák

4️⃣ Több szűrőfeltétel használata

---DAX

SalesForAIn2024 = CALCULATE( SUM(Sales[SalesAmount]), Sales[Product] = "A", Sales[Year] = 2024 )

🔹 Működés:

  • Az A termék eladásait számolja 2024-re.
  • Több szűrőfeltételt kombinálunk, így az eredmény csak az adott évre és termékre vonatkozó eladásokat tartalmazza.

5️⃣ Dinamikus szűrés (FILTER használata)

Ha egy feltétel nem egyszerű egyenlőség, hanem egy dinamikusabb szűrés, például minden olyan eladás, ahol az ár meghaladja az 120-at, akkor használhatjuk a FILTER() függvényt:

---DAX

SalesOver120 = CALCULATE( SUM(Sales[SalesAmount]), FILTER(Sales, Sales[Price] > 120) )

🔹 Működés:

  • A FILTER(Sales, Sales[Price] > 120) kiszűri azokat a sorokat, ahol az ár nagyobb, mint 120.
  • A CALCULATE() ezután kiszámítja a SUM(Sales[SalesAmount])-t az új szűrőkörnyezetben.



Összegzés: Mit tanultunk a CALCULATE() működéséről?

A CALCULATE() az egyik legfontosabb DAX függvény, amely lehetővé teszi a szűrőkörnyezet módosítását.
Új szűrőket adhatunk hozzá, felülírhatjuk a meglévőket, vagy akár el is távolíthatjuk azokat.
Más DAX függvényekkel kombinálva (ALL(), REMOVEFILTERS(), FILTER()) nagyon rugalmas számításokat végezhetünk.
Vizualizációkban segít a dinamikus és testreszabott számítások létrehozásában.


CALCULATE()  szűrési mechanizmusa

A szűrők hatása a Power BI DAX számításokban, amikor egy keresési táblán (lookup table, pl. dimenziótábla) alkalmazunk egy szűrőt, az automatikusan továbbterjed a kapcsolódó adattáblára (fact table) a kapcsolatok irányának megfelelően.

Példa az elv megértésére:

Adatok:

Tegyük fel, hogy van egy Értékesítések adattábla (fact table) és egy Termékek keresési tábla (lookup table).

Termékek (Dim_Product)
ProductIDTermékNévKategória
1LaptopElektronika
2EgérElektronika
3SzékBútor
Értékesítések (Fact_Sales)
SalesIDProductIDMennyiségÁr
10112500
1022150
10333100
10411500

A két tábla között egy egy-a-sokhoz (1:N) kapcsolat van a ProductID mezőn keresztül.


CALCULATE() alkalmazása:

Ha azt akarjuk kiszámítani, hogy mennyi volt az Elektronika kategóriába tartozó termékek összes értékesítése, akkor használhatunk egy DAX kifejezést:

---DAX

Elektronikai értékesítés összesen = CALCULATE( SUM(Fact_Sales[Ár]), Dim_Product[Kategória] = "Elektronika" )

Mi történik a háttérben?

  1. A CALCULATE() először alkalmazza a szűrőt a Dim_Product táblán → Kategória = "Elektronika".
  2. A ProductID alapján ez a szűrő átterjed a Fact_Sales táblára.
  3. Csak azok a sorok maradnak meg a Fact_Sales táblában, amelyek az "Elektronika" kategóriába tartozó termékekhez kapcsolódnak.
  4. Végül kiszámolja a SUM(Fact_Sales[Ár]) értéket.
Szűrés előtti értékek (minden termék szerepel):

SUM(Fact_Sales[Ár]) = 500 + 50 + 100 + 500 = 1150

Szűrés utáni értékek ("Elektronika" kategória termékei):
SalesIDProductIDMennyiségÁr
10112500
1022150
10411500

SUM(Fact_Sales[Ár]) = 500 + 50 + 500 = 1050

Tehát a kifejezés eredménye: 1050.


Összegzés

  • A CALCULATE() függvény a szűrőket először a keresési táblákra alkalmazza.
  • A szűrők automatikusan átterjednek a kapcsolódó adattáblákra.
  • Az egy-a-sokhoz kapcsolat biztosítja, hogy a szűrők fentről lefelé terjednek (lookup → fact table).
  • Ezért a fenti példában a Dim_Product[Kategória] = "Elektronika" szűrés hatással volt a Fact_Sales táblára, és csak az elektronikai termékek értékesítései maradtak meg.

Ezzel az elvvel hatékonyan lehet dinamikus szűréseket és számításokat végezni Power BI-ban!





A CALCULATE() függvényben használt ALL() és REMOVEFILTERS() függvények 


nagyon hasonló szerepet töltenek be: mindkettő eltávolítja a szűrőket egy adott oszlopról vagy tábláról. Azonban vannak fontos különbségek a működésükben és alkalmazásukban.



1️⃣ ALL() függvény

---DAX

ALL(<tábla vagy oszlop>)

Eltávolítja a szűrőket egy adott tábláról vagy oszlopról.
Visszaadja a teljes táblát vagy oszlopot, mintha nem lenne rajta semmilyen szűrés.
Képes kontextusfüggetlen számításokhoz is hozzájárulni (pl. százalékos összegzés).
Megőrzi az oszlopok egyediségét egy oszlopra alkalmazva (pl. DISTINCT COUNT esetén).

Példa: ALL() eltávolítja a termékszűrőt

---DAX

TotalSalesAllProducts = CALCULATE( SUM(Sales[SalesAmount]), ALL(Sales[Product]) )

🔹 Mit csinál?

  • Az ALL(Sales[Product]) eltávolítja a termékoszlopon lévő szűrőket.
  • Függetlenül attól, hogy egy vizualizációban vagy szeletelőben szűrünk egy termékre, ez mindig az összes termék eladását adja vissza.

📌 Fontos!
Az ALL() nem csak eltávolítja a szűrőket, hanem egy "teljes táblát" ad vissza, amelyet később más DAX függvényekkel is használhatunk.


2️⃣ REMOVEFILTERS() függvény

---DAX

REMOVEFILTERS(<tábla vagy oszlop>)

Kifejezetten a szűrők eltávolítására szolgál, de nem ad vissza új táblát.
Nincs hatása a sorok egyediségére – nem befolyásolja a DISTINCT COUNT számításokat.
Az ALL()-hoz hasonlóan működik, de kevésbé alkalmas számítási kontextus módosítására.

Példa: REMOVEFILTERS() eltávolítja az összes termékszűrőt

---DAX

TotalSalesAllProducts2 = CALCULATE( SUM(Sales[SalesAmount]), REMOVEFILTERS(Sales[Product]) )

🔹 Mit csinál?

  • Az REMOVEFILTERS(Sales[Product]) eltávolítja a termékoszlop szűrését.
  • Az eredmény ugyanaz lesz, mint az ALL(Sales[Product]) használatakor ebben az esetben.

📌 Fontos!
A REMOVEFILTERS() csak eltávolítja a szűrőket, de nem hoz létre új számítási kontextust, mint az ALL().


3️⃣ Mi a fő különbség?

TényezőALL()REMOVEFILTERS()
Eltávolítja a szűrőket?✅ Igen✅ Igen
Új táblát ad vissza?✅ Igen❌ Nem
Befolyásolja a DISTINCT COUNT-ot?✅ Igen❌ Nem
Alkalmas kontextusfüggetlen számításokra?✅ Igen❌ Nem
Elérhető sorok az eredménybenAz összes sor a táblábólAz aktuális kontextus sorai maradnak

4️⃣ Példa a különbségre: DISTINCT COUNT esete

Tegyük fel, hogy az ALL() és a REMOVEFILTERS() használatát szeretnénk összehasonlítani egy DISTINCT COUNT számítással.

Ha meg akarjuk számolni az egyedi termékek számát, akkor ALL() más eredményt ad, mint REMOVEFILTERS().

---DAX

ProductCount_ALL = CALCULATE( DISTINCTCOUNT(Sales[Product]), ALL(Sales[Product]) )


---DAX

ProductCount_REMOVEFILTERS = CALCULATE( DISTINCTCOUNT(Sales[Product]), REMOVEFILTERS(Sales[Product]) )

🔹 Mit csinálnak?

  • ALL(Sales[Product]) eltávolítja a termékszűrőket és egy teljes táblát hoz létre, amelyben újra megszámolhatók az egyedi értékek.
  • REMOVEFILTERS(Sales[Product]) csak törli a szűrőket, de nem befolyásolja az egyediség számítását.

📌 Eredménybeli különbség:

  • Ha a vizualizációban az egyik terméket kiválasztjuk, akkor ALL() mindig a teljes egyedi termékkészletet számolja meg.
  • REMOVEFILTERS() csak az aktuális kontextusból szűri ki a termékeket, így a DISTINCTCOUNT nem változik.

5️⃣ Mikor használjuk az ALL() vagy REMOVEFILTERS() függvényt?

Használati esetMelyiket használjuk?Miért?
Szűrők eltávolítása, de a számítási kontextus megtartása✅ REMOVEFILTERS()Nem módosítja az egyedi értékek számítását.
Teljes táblát szeretnénk visszaadni új számításokhoz✅ ALL()Egy új számítási kontextust hoz létre.
Alapérték számítása (pl. teljes összeg minden szűrő nélkül)✅ ALL()Megőrzi az összes adatot, mintha nem lenne szűrés.
Százalékos arányok és teljes összeg viszonyítása✅ ALL()A teljes számítási kontextust visszaadja.
Adott oszlop összes szűrőjének eltávolítása, de nem befolyásolva a kontextust✅ REMOVEFILTERS()Nem hoz létre új tábla kontextust.

Összegzés

ALL() egy teljes táblát ad vissza, amelyet későbbi számításokhoz használhatunk.
REMOVEFILTERS() csak eltávolítja a szűrőket, de nem módosítja a számítási kontextust.
ALL() módosítja az egyediség számítását is, míg REMOVEFILTERS() nem.
Ha egy teljes nézetet szeretnénk kapni a tábláról, akkor ALL() a megfelelő választás.
Ha csak szűrőket akarunk eltávolítani egy adott oszlopról, akkor REMOVEFILTERS() jobb.





Megjegyzések