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
🔹 <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:
- Új szűrőt ad hozzá: Korlátozza az adathalmazt egy adott feltétel alapján.
- 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.
- 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:
Product | Quantity | Price | SalesAmount |
---|---|---|---|
A | 2 | 100 | 200 |
B | 3 | 150 | 450 |
C | 1 | 200 | 200 |
A | 4 | 100 | 400 |
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:
🔹 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?
🔹 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:
🔹 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
🔹 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:
🔹 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)
ProductID | TermékNév | Kategória |
---|---|---|
1 | Laptop | Elektronika |
2 | Egér | Elektronika |
3 | Szék | Bútor |
Értékesítések (Fact_Sales)
SalesID | ProductID | Mennyiség | Ár |
---|---|---|---|
101 | 1 | 2 | 500 |
102 | 2 | 1 | 50 |
103 | 3 | 3 | 100 |
104 | 1 | 1 | 500 |
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:
Mi történik a háttérben?
- A CALCULATE() először alkalmazza a szűrőt a Dim_Product táblán → Kategória = "Elektronika".
- A ProductID alapján ez a szűrő átterjed a Fact_Sales táblára.
- Csak azok a sorok maradnak meg a Fact_Sales táblában, amelyek az "Elektronika" kategóriába tartozó termékekhez kapcsolódnak.
- 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):
SalesID | ProductID | Mennyiség | Ár |
---|---|---|---|
101 | 1 | 2 | 500 |
102 | 2 | 1 | 50 |
104 | 1 | 1 | 500 |
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
✅ 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
🔹 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
✅ 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
🔹 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ényben | Az összes sor a táblából | Az 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().
🔹 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 eset | Melyiket 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
Megjegyzés küldése