Aceasta este o copie de probă. Site-ul adevărat este data-analist.com.
contact@data-analist.com
str. Igor Vieru 15, Chișinău Republica Moldova

Automatizăm procese. Analizăm date. Găsim soluții.

DAX pentru începători: zece funcții esențiale într-un raport
HomePower BI DAX pentru începători: zece funcții esențiale într-un raport
Zece funcții DAX care acoperă cele mai multe situații dintr-un raport Power BI real. Fără SUMX exotic, fără variabile imbricate de patru niveluri - doar setul minim care îți permite să livrezi.

Cineva care învață DAX își începe drumul, de regulă, după ce a făcut deja primul raport în Power BI. A tras câteva coloane, a făcut un grafic, totul a mers. Apoi a vrut să calculeze procentul de creștere față de luna anterioară și s-a oprit. Aici începe DAX-ul real - și aici încep, simultan, primele frustrări.

Limbajul are reputația că „arată ca Excel, dar nu se comportă ca Excel". Reputația e meritată. Din experiența pe proiecte reale cu echipe care au trecut prin tranziția Excel - Power BI, capcana principală e că primele formule par să funcționeze - până în momentul în care le pui într-un context cu filtre.

Articolul de față nu acoperă tot DAX-ul. Acoperă zece funcții DAX esențiale care, combinate corect, rezolvă cel puțin 80% din nevoile dintr-un raport business standard.

Premisa DAX: măsurile nu sunt coloane calculate

Înainte de funcții, o lămurire care economisește săptămâni. În DAX există două tipuri principale de calcule: coloane calculate (calculated columns) și măsuri (measures). Arată similar, se scriu similar, dar se comportă fundamental diferit.

O coloană calculată e evaluată o singură dată, pe rând, la momentul refresh-ului. Ocupă spațiu în model. Folosește row context.

O măsură e evaluată în momentul afișării, în contextul vizualului. Nu ocupă spațiu fix. Folosește filter context.

Regula simplă: dacă vrei să agregi (sumă, medie, procent), faci măsură. Dacă vrei să clasifici un rând individual într-o categorie nouă, faci coloană calculată. Greșeala clasică e să faci coloane calculate pentru ceea ce ar trebui să fie măsuri - rezultatul e un model umflat și o performanță proastă.

1. SUM - punctul de pornire onest

SUM e cea mai simplă măsură posibilă. Adună valorile dintr-o coloană numerică.

Total Vânzări = SUM(Vânzări[Valoare])

Pare banală. Și e. Dar e și punctul în care începi să gândești corect: orice măsură pe care o construiești în viitor va porni de la sau va folosi o astfel de bază. Convenția profesională recomandă să ai întotdeauna câteva măsuri-rădăcină (Total Sales, Total Cost, Total Quantity) și să derivi tot restul din ele. Așa rămâne raportul ușor de întreținut.

2. CALCULATE - inima limbajului

CALCULATE e funcția care face DAX-ul să fie DAX, și nu un Excel mai sofisticat. Permite să modifici contextul de filtru al unei măsuri.

Vânzări Online = CALCULATE([Total Vânzări], Vânzări[Canal] = "Online")

Citită corect, formula spune: „calculează totalul vânzărilor, dar înlocuiește filtrul curent pe coloana Canal cu condiția Canal = Online". Rezultatul: indiferent ce filtru pune utilizatorul în pagină, această măsură va arăta doar partea Online.

De ce contează? Pentru că aproape orice metrică business de tipul „vânzări de categoria X", „clienți activi din segmentul Y", „comenzi mai mari de 1000 lei" se construiește cu CALCULATE. Cine învață doar SUM și media e blocat la primul KPI complex.

3. DIVIDE - împărțirea care nu cade

În DAX, dacă faci `[Profit] / [Vânzări]` și vânzările sunt zero pe un context, primești o eroare sau o celulă goală. DIVIDE rezolvă elegant problema.

Marjă % = DIVIDE([Profit], [Vânzări], 0)

Al treilea parametru e valoarea returnată când divizorul e zero. Practic, e o variantă DAX-friendly de „IFERROR pe împărțire". Folosește-o întotdeauna pentru rapoarte, niciodată operatorul `/` direct. E o regulă mică, dar elimină un întreg gen de bug-uri pe care le vezi în prezentări către management.

4. FILTER - când CALCULATE nu e suficient

CALCULATE acceptă filtre simple direct. Pentru filtre complexe, ai nevoie de FILTER.

Vânzări Clienți Mari =
CALCULATE(
    [Total Vânzări],
    FILTER(Clienți, Clienți[Cifra Afaceri] > 100000)
)

FILTER returnează un tabel cu rândurile care îndeplinesc condiția. CALCULATE folosește acel tabel ca filtru. Construcția permite condiții care depind de măsuri sau de calcule per rând.

Atenție însă: FILTER e mai costisitoare decât un filtru simplu. Pe modele mari, abuzul de FILTER e prima sursă de raport lent. Folosește când chiar ai nevoie, nu reflex.

5. RELATED - când te uiți peste relație

Modelele Power BI sunt construite pe relații între tabele. Când scrii o măsură pe tabelul Vânzări dar vrei să te referi la o coloană din tabelul Produse, ai nevoie de RELATED.

Vânzări cu Categorie = SUMX(Vânzări, Vânzări[Cantitate] * RELATED(Produse[Preț]))

RELATED funcționează doar într-un row context (deci în interiorul unui SUMX, AVERAGEX sau într-o coloană calculată). Direcția contează: din tabel many către tabel one. Invers, ai nevoie de RELATEDTABLE.

Pe modele bine construite cu schemă star, RELATED apare frecvent. Pe modele prost normalizate, semnalează că ar trebui revizuită structura înainte să continui să scrii măsuri peste un model fragil.

6. SUMX - iterator când contează rândul

SUM adună o coloană. SUMX iterează prin rândurile unui tabel și adună rezultatul unei expresii per rând.

Total Vânzări Calculat = SUMX(Vânzări, Vânzări[Cantitate] * Vânzări[Preț Unitar])

Diferența contează când nu ai precalculată coloana totală în date. Cantitate * Preț nu există ca atare în tabel, dar SUMX evaluează expresia pe fiecare rând și adună rezultatele.

În practică, mai bine de jumătate dintre rapoartele de vânzări reale folosesc SUMX undeva. Dacă datele tale vin dintr-un ERP care nu stochează valori precalculate, vei trăi cu SUMX zilnic.

7. DATEADD - time intelligence fără bătăi de cap

Time intelligence e zona în care utilizatorii noi se blochează cel mai des. Există funcții complicate (SAMEPERIODLASTYEAR, PARALLELPERIOD, DATESYTD), dar pentru început, DATEADD e suficient pentru majoritatea cazurilor.

Vânzări Luna Trecută =
CALCULATE([Total Vânzări], DATEADD(Calendar[Date], -1, MONTH))

Formula spune: calculează vânzările, dar mută contextul de dată cu o lună înapoi. Funcționează identic pentru -1 YEAR, -1 QUARTER, +1 DAY.

Condiția critică: trebuie să ai un tabel Calendar marcat ca date table și conectat la tabelul de fapte. Fără asta, DATEADD nu funcționează predictibil. Crearea unui tabel Calendar curat e probabil cea mai bună investiție de o oră pe care o faci la începutul unui proiect Power BI.

8. ALL - când vrei să ignori filtrele

ALL elimină filtrele dintr-un tabel sau dintr-o coloană. E folosit cel mai des pentru a calcula totaluri sau procente față de un total general.

% din Total = DIVIDE([Total Vânzări], CALCULATE([Total Vânzări], ALL(Vânzări)))

Într-un vizual cu defalcare pe regiuni, această măsură va calcula pentru fiecare regiune procentul din totalul tuturor regiunilor. Fără ALL, raportul ar afișa 100% în fiecare rând (pentru că filtrul de regiune se aplică și la numitor).

Există și ALLEXCEPT (păstrează doar anumite filtre), ALLSELECTED (păstrează filtrele utilizatorului dar elimină contextul de vizual). Pentru început, ALL e suficient să înțelegi conceptul.

9. IF și SWITCH - logică condițională curată

IF e simplu și familiar din Excel. SWITCH e versiunea elegantă pentru cazuri multiple.

Categorie Performanță =
SWITCH(
    TRUE(),
    [Total Vânzări] > 1000000, "Excelent",
    [Total Vânzări] > 500000, "Bun",
    [Total Vânzări] > 100000, "Mediu",
    "Sub Țintă"
)

SWITCH cu TRUE() e o convenție foarte folosită în comunitatea Power BI. Permite scrierea de logică tip „if-elseif-else" într-o formă mult mai lizibilă decât IF imbricat de patru niveluri.

Un sfat care vine din practică: dacă te trezești scriind un IF cu mai mult de două ramuri, e aproape sigur că ar trebui să fie SWITCH. Cod-review-ul lizibil pentru cine moștenește raportul peste un an depinde de astfel de detalii.

10. VAR - variabilele care fac codul citibil

VAR nu e tehnic o funcție, ci o construcție de limbaj. Dar e între cele zece lucruri pe care le folosești zilnic odată ce le descoperi.

Creștere %  =
VAR VanzariCurente = [Total Vânzări]
VAR VanzariAnteriore = CALCULATE([Total Vânzări], DATEADD(Calendar[Date], -1, YEAR))
VAR Diferența = VanzariCurente - VanzariAnteriore
RETURN
    DIVIDE(Diferența, VanzariAnteriore, 0)

Trei avantaje. Primul: codul devine mult mai ușor de citit. Al doilea: fiecare măsură intermediară e evaluată o singură dată (în loc să fie recalculată în fiecare loc unde o referințezi). Al treilea: debugging-ul se face simplu, înlocuind temporar valoarea returnată cu una dintre variabile pentru a verifica rezultatele intermediare.

Cei care lucrează cu DAX serios scriu majoritatea măsurilor non-triviale folosind VAR. Echipele care n-au descoperit-o încă recunosc codul vechi imediat - șiruri lungi de CALCULATE imbricate, cu paranteze pe trei niveluri.

Cum compui aceste zece funcții într-un raport real

Un raport de vânzări tipic, construit cu setul de mai sus, arată cam așa:

  • Măsuri-rădăcină: Total Vânzări (SUM), Total Cost (SUM), Profit (Total Vânzări - Total Cost).
  • Derivate procentuale: Marjă % (DIVIDE), % din Total (DIVIDE + ALL).
  • Time intelligence: Vânzări LY (CALCULATE + DATEADD), Creștere % (VAR + DIVIDE).
  • Segmentări: Vânzări Online (CALCULATE direct), Vânzări Clienți Mari (CALCULATE + FILTER).
  • Calcule pe rând: Total Vânzări Calculat (SUMX, când nu ai coloana pre-calculată).
  • Clasificări: Categorie Performanță (SWITCH + TRUE).

Cu doar acestea, acoperi un raport executiv complet: KPI-uri principale, comparații față de perioade anterioare, defalcări pe segmente, ierarhii produse - categorii. Restul DAX-ului (RANKX, TOPN, EARLIER, calculate tables, time intelligence avansată) îți va trebui când vei avea o problemă specifică care chiar le cere.

Ce să nu faci la început

Trei capcane comune pe care le văd des la cei care învață DAX după ce au făcut un an de Excel.

Nu transforma fiecare „aș vrea o coloană nouă" într-o coloană calculată. Dacă rezultatul depinde de filtrele aplicate în vizual (cum sunt 90% din KPI-urile dintr-un raport), trebuie să fie măsură. Coloana calculată îți va da rezultate aparent corecte într-un tabel simplu, dar va da rezultate stranii când va fi pus într-un context de filtre.

Nu abuza de FILTER. Pe modele de zeci de milioane de rânduri, un FILTER inutil într-o măsură evaluată în 20 de vizuale simultan e diferența între 0.5 secunde și 12 secunde de încărcare.

Nu sări peste tabelul Calendar. Auto-date intelligence pe care Power BI Desktop o include implicit ascunde un tabel calendar generat automat în fundal. E util ca scaffolding, dar pe un raport real, un tabel Calendar explicit, marcat ca date table, e singura soluție serioasă.

Tema se leagă natural de discuția despre Power BI vs Tableau, unde am intrat în detaliu pe pattern-urile pe care le observăm în piață.

Ce urmează după aceste zece funcții

Pentru cei care vor să continue, există o ordine naturală. Documentația oficială DAX e referința completă, dar nu un drum de învățare.

După setul de bază, următoarele puncte de extindere - în ordinea în care chiar îți vor folosi - sunt: CALCULATETABLE și ADDCOLUMNS (pentru tabele calculate dinamic); RANKX și TOPN (pentru clasamente); ALLSELECTED (pentru procente cu păstrarea filtrelor utilizatorului); time intelligence avansată (DATESINPERIOD, DATESBETWEEN, custom calendars); EARLIER (pentru calcule cu referință la contexte încadrate).

Dar înainte de toate astea, asigură-te că ești 100% confortabil cu cele zece. Un raport scris cu fluență pe funcțiile esențiale e mai bun decât unul scris cu funcții exotice pe care nu le stăpânește autorul. Iar la cod-review în patru luni, varianta simplă va părea în continuare scrisă de un profesionist.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Politica de confidențialitate · Politica de cookie-uri