Le idee che fanno davvero la differenza con DAX
- DAX è un linguaggio di formule usato in Power BI, Analysis Services e Power Pivot.
- Le misure cambiano risultato in base ai filtri del report, mentre le colonne calcolate vengono valutate riga per riga.
- Il contesto di filtro è il concetto più importante per capire perché una misura restituisce un certo valore.
- CALCULATE modifica il contesto e rappresenta il punto di partenza per molte analisi avanzate.
- Un buon modello dati a stella rende le formule più semplici, leggibili e veloci.
Che cos’è DAX e perché serve davvero in Power BI
DAX, acronimo di Data Analysis Expressions, è il linguaggio di formule utilizzato per creare calcoli nei modelli tabulari. È presente in Power BI, Power Pivot per Excel e Analysis Services e lavora su tabelle correlate, colonne e relazioni.
Non va confuso con SQL o con un linguaggio di programmazione tradizionale. DAX non serve principalmente a estrarre righe da un database, ma a definire come interpretare i dati durante l’analisi. Una stessa misura può quindi restituire risultati diversi quando l’utente seleziona un anno, una regione o una categoria di prodotto.
Per esempio, una semplice misura per il fatturato può essere scritta così:
Fatturato = SUM(Vendite[Importo])
Da sola sembra banale, ma diventa dinamica appena la inserisco in una tabella con anno, mese o cliente. Il motore calcola il totale solo per il contesto visualizzato. È questo il passaggio che spesso sorprende chi arriva da Excel, dove una formula è normalmente legata a un intervallo preciso di celle.
DAX permette di creare misure, colonne calcolate, tabelle calcolate e regole di sicurezza a livello di riga. Nella pratica, però, le misure sono quasi sempre il punto di partenza migliore per costruire KPI e report interattivi.
Misure e colonne calcolate non fanno lo stesso lavoro
La distinzione tra misura e colonna calcolata è una delle prime decisioni importanti. Usare l’oggetto sbagliato può rendere il modello più pesante, complicare la manutenzione e produrre risultati poco intuitivi.
Quando usare una misura
Una misura viene calcolata quando il visual o il filtro ne richiede il risultato. Per questo è adatta a totali, percentuali, margini, medie e confronti temporali.
Margine = SUM(Vendite[Ricavo]) - SUM(Vendite[Costi])
La misura si adatta automaticamente alla riga o alla colonna del visual. Se la mostro per regione, calcola il margine regionale; se aggiungo il mese, produce il dettaglio mensile. Non devo creare una nuova formula per ogni combinazione di filtri.
Quando usare una colonna calcolata
Una colonna calcolata viene calcolata per ogni riga della tabella e resta memorizzata nel modello. È utile quando il risultato deve essere utilizzato come categoria, filtro, relazione o campo di raggruppamento.
Ricavo Netto = Vendite[Quantità] * Vendite[Prezzo] - Vendite[Sconto]
Questa formula produce un valore distinto per ogni riga della tabella Vendite. Se il calcolo serve solo per ottenere un totale, preferisco spesso una misura, perché evita di aumentare inutilmente la dimensione del modello.
| Elemento | Quando viene calcolato | Uso tipico |
|---|---|---|
| Misura | Quando il visual la richiede | KPI, totali, percentuali, trend |
| Colonna calcolata | Riga per riga durante il refresh | Categorie, segmentazioni, classificazioni |
| Tabella calcolata | Durante il refresh del modello | Scenari specifici e tabelle di supporto |
La regola che seguo è semplice: se il risultato deve reagire ai filtri, parto da una misura. Se invece devo conservare un valore per ogni riga o usarlo per suddividere i dati, valuto una colonna calcolata.
Il contesto di filtro è il cuore del linguaggio DAX
Molte formule sembrano corrette ma restituiscono numeri inattesi perché non si considera il contesto. In DAX il risultato dipende dai filtri applicati dal visual, dagli slicer, dalle relazioni tra tabelle e dagli eventuali filtri inseriti nella formula.
Immaginiamo una tabella con le colonne Anno e Fatturato. La misura seguente:
Fatturato = SUM(Vendite[Importo])
restituisce il totale generale quando non esiste un filtro, ma restituisce il valore del singolo anno quando la riga del visual contiene un anno. La formula non cambia: cambia il contesto di filtro in cui viene valutata.
Il ruolo di CALCULATE
La funzione più importante per modificare il contesto è CALCULATE. Permette di applicare filtri aggiuntivi o di rimuovere quelli esistenti.
Fatturato Online =
CALCULATE(
[Fatturato],
Vendite[Canale] = "Online"
)
Questa misura mantiene gli altri filtri del report, ma limita il calcolo alle vendite online. È un comportamento molto diverso da quello di una semplice somma e spiega perché DAX diventa particolarmente potente nei modelli ben organizzati.
Contesto di riga e contesto di filtro
Il contesto di riga riguarda la riga corrente e compare soprattutto nelle colonne calcolate e nelle funzioni iteratore. Il contesto di filtro, invece, definisce l’insieme di dati visibile durante il calcolo.Funzioni come SUMX, AVERAGEX e FILTER lavorano spesso su una tabella riga per riga. Per esempio:
Valore Ordini =
SUMX(
Vendite,
Vendite[Quantità] * Vendite[Prezzo]
)
Qui DAX percorre la tabella Vendite, calcola il valore di ogni riga e poi somma i risultati. Quando una misura non funziona come previsto, controllo prima quale tabella viene iterata e quali filtri sono attivi, invece di aggiungere funzioni a caso.
Le funzioni DAX da imparare per prime
Non serve memorizzare centinaia di funzioni. Per iniziare bene conviene padroneggiare pochi gruppi che coprono la maggior parte dei calcoli quotidiani in Power BI.
| Gruppo | Funzioni utili | A cosa servono |
|---|---|---|
| Aggregazioni | SUM, AVERAGE, MIN, MAX, COUNTROWS | Totali, medie, estremi e conteggi |
| Filtri | CALCULATE, FILTER, ALL, REMOVEFILTERS | Modifica e gestione del contesto |
| Condizioni | IF, SWITCH, COALESCE | Logiche decisionali e gestione dei valori vuoti |
| Relazioni | RELATED, RELATEDTABLE, USERELATIONSHIP | Accesso a dati collegati tra tabelle |
| Date | DATE, YEAR, MONTH, DATEADD, TOTALYTD | Analisi per periodo e confronti temporali |
| Iteratori | SUMX, AVERAGEX, MINX, MAXX | Calcoli riga per riga su una tabella |
Per una percentuale sul totale, una combinazione frequente è:
Percentuale sul Totale =
DIVIDE(
[Fatturato],
CALCULATE(
[Fatturato],
REMOVEFILTERS(Prodotti)
)
)
DIVIDE è preferibile all’operatore di divisione diretto perché gestisce in modo più sicuro il denominatore uguale a zero. In questo caso rimuovo il filtro sui prodotti, ma lascio attivi gli altri filtri, come anno o regione. Il dettaglio del filtro rimosso determina il significato reale della percentuale.
Per il confronto con l’anno precedente, serve una tabella calendario collegata alla tabella dei fatti:
Fatturato Anno Precedente =
CALCULATE(
[Fatturato],
DATEADD(Calendario[Data], -1, YEAR)
)
Se il calendario è incompleto o non contiene una riga per ogni data, le funzioni temporali possono produrre risultati inattesi. Questo è uno dei casi in cui una formula apparentemente corretta non basta: la qualità del modello viene prima della complessità della misura.
Power Query, DAX e SQL hanno ruoli diversi
Un errore comune consiste nel usare DAX per risolvere ogni problema. In Power BI ci sono almeno tre livelli distinti, e ognuno ha un compito preciso.
| Strumento | Compito principale | Esempio |
|---|---|---|
| SQL | Interrogare e preparare i dati alla fonte | Unire tabelle dal database |
| Power Query | Importare, pulire e trasformare i dati | Correggere tipi, eliminare duplicati, dividere colonne |
| DAX | Creare analisi dinamiche nel modello | Margine, crescita annua, quota sul totale |
Se devo correggere una colonna con valori sporchi, lo faccio prima del caricamento con Power Query. Se devo calcolare una metrica che deve reagire ai filtri del report, uso una misura DAX. Separare bene trasformazione e analisi rende il file più veloce da aggiornare e molto più facile da capire.
Non esiste una regola assoluta. Un calcolo semplice può essere svolto in più modi, ma scelgo quello che mantiene i dati nel posto più adatto. Spostare in DAX una trasformazione che potrebbe essere eseguita una volta sola in Power Query spesso significa caricare complessità nel modello senza ottenere un vantaggio reale.
Gli errori più frequenti e come correggerli
Usare una colonna quando serve una misura
Una colonna calcolata può mostrare il risultato giusto riga per riga, ma non è automaticamente adatta a un KPI filtrabile. Se il valore deve cambiare per mese, cliente o reparto, verifico prima se sto cercando una misura dinamica.
Dimenticare le relazioni
Una misura può essere scritta perfettamente e restituire lo stesso totale per ogni categoria se la relazione tra la tabella delle dimensioni e quella delle vendite è assente, inattiva o configurata nella direzione sbagliata. Prima di riscrivere la formula, controllo chiave, cardinalità e direzione del filtro.
Filtrare con ALL senza capire cosa si elimina
ALL può rimuovere più filtri di quanto si desideri. Per questo, nei modelli moderni preferisco spesso REMOVEFILTERS, che rende più evidente l’intenzione della formula.
Ignorare i valori vuoti
Uno zero e un valore vuoto non comunicano la stessa cosa. Uno zero indica spesso assenza di valore, mentre un vuoto può significare che non esiste un dato applicabile. Con COALESCE posso decidere esplicitamente come visualizzare il risultato, ma non dovrei usarlo per nascondere un problema nella sorgente.
Leggi anche: Esempi di Power BI e DAX per decisioni aziendali migliori
Scrivere formule troppo lunghe
Quando una misura supera molte righe, la divido in misure intermedie con nomi chiari. Per esempio, creo prima Fatturato, poi Costi, poi Margine e infine Margine Percentuale. La leggibilità è parte della qualità tecnica, soprattutto quando il modello dovrà essere modificato da altre persone.
Un metodo pratico per imparare e lavorare meglio
Per imparare DAX non partirei dall’elenco delle funzioni. Partirei da un modello piccolo, con una tabella Vendite, una tabella Prodotti, una tabella Clienti e un calendario. Poi costruirei ogni misura partendo da una domanda aziendale concreta.
- Definisco il significato del KPI in una frase.
- Controllo quali tabelle e colonne devono partecipare al calcolo.
- Creo una misura base, come il fatturato totale.
- Aggiungo filtri o confronti temporali uno alla volta.
- Verifico il risultato in una tabella semplice prima di inserirlo in un grafico.
Una formula come [Fatturato] / [Numero Ordini] può sembrare sufficiente per calcolare il valore medio, ma solo se il denominatore rappresenta davvero il numero corretto di ordini nel contesto corrente. Uso quindi nomi espliciti e controllo sempre il risultato su totale generale, dettaglio e casi vuoti.
Anche la formattazione conta. In base alle impostazioni locali di Power BI, gli argomenti delle funzioni possono richiedere la virgola oppure il punto e virgola. Se una formula copiata da un esempio genera un errore di sintassi, questo è uno dei primi aspetti da controllare.
La scelta che rende DAX più semplice nel tempo
DAX diventa molto più comprensibile quando il modello è costruito con una struttura a stella, con una tabella dei fatti al centro e dimensioni separate per date, prodotti, clienti o sedi. In questa configurazione le relazioni sono più prevedibili e le misure hanno meno bisogno di correzioni speciali.
Il consiglio che darei a chi comincia è di dedicare più tempo a modello, relazioni e contesto che alla ricerca della funzione più sofisticata. Una misura breve inserita nel posto giusto vale spesso più di una formula elaborata che tenta di compensare dati disordinati.
Una volta compresi questi principi, le funzioni DAX smettono di sembrare un catalogo da memorizzare. Diventano strumenti per esprimere domande analitiche precise, trasformando un report di Power BI da semplice elenco di numeri a modello utile per prendere decisioni.
