Adatmodell és DAX röviden
Az adatmodell az a szerkezet, amelyben a betöltött táblák egymáshoz kapcsolódnak; a DAX pedig az a nyelv, amellyel a számításokat leírjuk. A kettő együtt dönti el, hogy a riport gyors, bővíthető és érthető lesz-e.
Egy jó modell felismerhető arról, hogy új kérdésre általában nem kell új adatot behozni – elég egy új mérték vagy egy új vizuál. Egy rossz modellnél viszont minden új kérés újabb kerülőmegoldást szül.
A csillagséma – a Power BI természetes formája
A Power BI motorja (VertiPaq) arra van optimalizálva, hogy ténytáblák köré dimenziótáblák csoportosuljanak. Ez a csillagséma.
- Ténytábla: az események, mérhető számokkal – értékesítési tételek, könyvelési sorok, gyártási jelentések. Sok sor, kevés oszlop, jellemzően azonosítók és számértékek.
- Dimenziótábla: a leíró adatok – ügyfél, termék, dátum, régió, értékesítő. Kevés sor, több leíró oszlop.
A gyakori kísértés az, hogy egyetlen nagy, „mindent tartalmazó" táblát hozzunk létre, mert Excelben így szoktuk meg. Ez működhet kis adaton, de gyorsan lassuláshoz és nehezen karbantartható riporthoz vezet: minden ismétlődő szöveges érték helyet foglal, és a szűrők logikája is átláthatatlanná válik.
Ökölszabály
Ha egy oszlop leír valamit (név, kategória, régió), az dimenzióba való. Ha mér valamit (mennyiség, összeg, darab), az ténytáblába. A dátum mindig külön dimenziótáblát kap.
Kapcsolatok – iránnyal és számossággal
A táblák közötti kapcsolatnak két fontos tulajdonsága van:
- Számosság: a leggyakoribb az egy-a-többhöz (1:*) – egy termék sok értékesítési tételhez tartozik. A több-a-többhöz (*:*) kapcsolatot csak indokolt esetben érdemes használni.
- Szűrési irány: alapesetben egyirányú: a dimenzió szűri a ténytáblát. A kétirányú szűrés kényelmesnek tűnik, de nehezen követhető viselkedést és teljesítményproblémát okozhat – csak tudatosan, indokolt esetben használja.
Ha két ténytábla között kellene kapcsolat, az szinte mindig jelzés: hiányzik egy közös dimenzió, amelyhez mindkettő kapcsolódhatna.
A dátumtábla – enélkül nincs időbeli elemzés
Szinte minden riport tartalmaz időbeli összehasonlítást: előző hónap, előző év, év eleje óta. Ehhez egy külön, folytonos dátumtábla kell, amely minden napot tartalmaz az időszakban – lyukak nélkül.
-- Számított tábla: folytonos naptár a ténytábla időtartományára Datum = VAR MinDatum = MIN( Ertekesites[Datum] ) VAR MaxDatum = MAX( Ertekesites[Datum] ) RETURN ADDCOLUMNS( CALENDAR( DATE( YEAR(MinDatum), 1, 1 ), DATE( YEAR(MaxDatum), 12, 31 ) ), "Év", YEAR( [Date] ), "Hónap sz.", MONTH( [Date] ), "Hónap", FORMAT( [Date], "yyyy. mm." ), "Negyedév", "Q" & QUARTER( [Date] ), "Hét", WEEKNUM( [Date], 2 ) )
Két lépés maradt: a táblát meg kell jelölni dátumtáblaként (Mark as date table), és a szöveges hónaposzlopot rendezni kell a hónap sorszáma szerint (Sort by column) – különben ábécésorrendben jelenne meg.
Tipp: érdemes kikapcsolni a Power BI automatikus dátumhierarchiáját (Beállítások → Adatok betöltése → Auto date/time). Minden dátumoszlop mögé rejtett táblát generál, ami feleslegesen növeli a modell méretét.
Mérték vagy számított oszlop?
Mérték (measure)
- Akkor számolódik ki, amikor megjeleníti – a szűrők szerint.
- Nem foglal helyet a modellben.
- Erre való a legtöbb üzleti mutató: összeg, arány, átlag, eltérés.
- Kétség esetén mértéket írjon.
Számított oszlop
- Frissítéskor számolódik ki, soronként, és tárolódik.
- Növeli a modell méretét.
- Akkor indokolt, ha az érték soronként fix, és szűrni vagy csoportosítani akar vele.
- Ha lehet, inkább a Power Queryben (vagy a forrásban) állítsa elő.
A leggyakoribb DAX mértékek
A riportok többsége néhány visszatérő mintára épül. Az alábbiak lefedik a tipikus üzleti kérdések nagy részét.
-- 1) Alapösszeg Árbevétel = SUM( Ertekesites[NettoOsszeg] ) -- 2) Előző év azonos időszaka Árbevétel EV = CALCULATE( [Árbevétel], SAMEPERIODLASTYEAR( Datum[Date] ) ) -- 3) Eltérés az előző évhez képest, százalékban Árbevétel EV % = VAR Elozo = [Árbevétel EV] RETURN DIVIDE( [Árbevétel] - Elozo, Elozo ) -- 4) Év eleje óta (YTD) Árbevétel YTD = TOTALYTD( [Árbevétel], Datum[Date] ) -- 5) Arány a teljes piachoz képest (a szűrő feloldásával) Piaci részesedés = DIVIDE( [Árbevétel], CALCULATE( [Árbevétel], ALL( Termek[Kategoria] ) ) ) -- 6) Egyedi ügyfelek száma Aktív ügyfelek = DISTINCTCOUNT( Ertekesites[UgyfelID] )
Néhány szabály, amely hosszú távon sokat számít:
- Osztásnál mindig
DIVIDE(), ne a/operátor – így a nullával osztás nem hibát, hanem üres értéket ad. - Építsen egymásra: az összetett mértékek hivatkozzanak az alapmértékekre, ne ismételjék meg a képletet.
- Használjon
VARváltozókat – olvashatóbb és gyorsabb is, mert az érték egyszer számolódik ki. - Tegye a mértékeket külön, dedikált táblába (pl. „_Mértékek"), hogy a mezőlistában könnyen megtalálhatók legyenek.
- Nevezze őket üzleti nyelven – a riportban ez a név fog megjelenni.
A szűrési környezet (filter context)
Ez a DAX legfontosabb fogalma, és egyben a leggyakoribb félreértés forrása. Egy mérték értéke mindig attól függ, milyen szűrők vannak érvényben abban a cellában, ahol megjelenik.
Ha egy táblázat sorában „2026. március" és „Északi régió" szerepel, akkor az [Árbevétel] mérték csak azokra a sorokra számol, amelyek megfelelnek ennek a két szűrőnek. Ugyanaz a képlet más cellában más eredményt ad – ez nem hiba, hanem a működés lényege.
A CALCULATE() az a függvény, amellyel ezt a környezetet módosítani lehet: hozzáadhat, felülírhat vagy eltávolíthat szűrőket. Az ALL(), REMOVEFILTERS() és KEEPFILTERS() ennek a finomhangolására szolgálnak.
Ha nem stimmel a szám
A hibakeresés első kérdése mindig ugyanaz: milyen szűrők érvényesek abban a cellában? A vizuál „Adatok megjelenítése" funkciója és a Performance Analyzerben kimásolt DAX-lekérdezés (pl. DAX Studióban futtatva) többnyire azonnal megmutatja a választ.
Tipikus modellezési hibák
- Egyetlen óriási, lapos tábla – az Excel-reflex. Bontsa tény- és dimenziótáblákra.
- Hiányzó dátumtábla – enélkül az időbeli függvények megbízhatatlanul működnek.
- Kétirányú kapcsolatok mindenhol – nehezen kiszámítható eredményt és lassulást okoz.
- Számított oszlop mérték helyett – feleslegesen növeli a modellt.
- Nagy kardinalitású oszlopok (pl. időbélyeg másodperccel, egyedi tranzakcióazonosító) – ezek tömörödnek a legrosszabbul; ha nem kell, hagyja el őket.
- Technikai oszlopnevek a riportban – az „ATVET_NETTO_OSSZ" senkinek nem mond semmit; nevezze át.
Összetett a számítási logika?
A kalkulátorban jelezze, milyen szintű számításokra van szüksége – az egyszerű összegzéstől a szcenárióelemzésig –, és megmutatjuk, ez mekkora ráfordítást jelent.
Kalkulátor indítása