Quando un totale in Power BI non cambia come dovrebbe passando da un grafico all’altro, quasi sempre il problema non è la formula matematica, ma il modo in cui DAX interpreta filtri e contesto. In questa guida mostro come creare calcoli affidabili con misure, colonne calcolate e funzione CALCULATE, usando esempi concreti per vendite, margini, percentuali e confronto temporale.
Il metodo più solido per calcolare in Power BI parte dal contesto
- Le misure reagiscono ai filtri del report e sono la scelta principale per KPI e analisi dinamiche.
- CALCULATE modifica il contesto di filtro e permette di valutare una stessa espressione in condizioni diverse.
- FILTER, ALL, REMOVEFILTERS e KEEPFILTERS servono a controllare con precisione quali filtri mantenere o ignorare.
- SUMX e DIVIDE aiutano a gestire correttamente calcoli riga per riga e divisioni senza errori.
- Un modello con tabella calendario e relazioni corrette è indispensabile per confronti mensili e annuali affidabili.

Misure e colonne calcolate risolvono problemi diversi
Prima di scrivere DAX, decido dove deve vivere il calcolo. Una misura viene valutata quando l’utente visualizza un report e cambia in base a filtri, segmentazioni e righe della matrice. Una colonna calcolata, invece, viene calcolata riga per riga durante l’aggiornamento del modello e il risultato viene memorizzato.
| Elemento | Quando viene calcolato | Uso consigliato |
|---|---|---|
| Misura | Quando viene visualizzato il report | Totali, KPI, margini, percentuali e confronti dinamici |
| Colonna calcolata | Durante il refresh dei dati | Categorie, classificazioni e valori necessari riga per riga |
| Tabella calcolata | Durante il refresh del modello | Tabelle di supporto e scenari specifici |
Per esempio, il valore di ogni singola vendita può essere ottenuto con una colonna come questa:
Vendite[Totale Riga] = Vendite[Quantità] * Vendite[Prezzo Unitario]Se invece voglio mostrare il fatturato totale in una scheda o in un grafico, preferisco una misura:
Vendite Totali = SUM(Vendite[Importo])La differenza è sostanziale. La misura restituisce un risultato diverso per ogni combinazione di anno, regione, prodotto o cliente presente nel report. Una colonna calcolata mantiene il proprio valore anche quando l’utente cambia la selezione, quindi non è adatta a rappresentare KPI dinamici.
Nella pratica, molti modelli diventano più pesanti perché trasformano in colonne calcolate calcoli che dovrebbero essere misure. Quando la trasformazione riguarda semplicemente i dati originali, considero anche Power Query. DAX dovrebbe concentrarsi soprattutto sulla logica analitica.
Che cosa cambia davvero con CALCULATE
La funzione CALCULATE valuta un’espressione modificando il contesto di filtro. In altre parole, permette di chiedere a Power BI di calcolare lo stesso indicatore come se alcuni filtri fossero stati aggiunti, sostituiti o rimossi.
CALCULATE(
,
,
) Parto da una misura semplice e la riutilizzo in più scenari:
Vendite Totali = SUM(Vendite[Importo])
Vendite Online =
CALCULATE(
[Vendite Totali],
Vendite[Canale] = "Online"
)La prima misura segue tutti i filtri applicati nel report. La seconda conserva il contesto generale, ma aggiunge la condizione sul canale. Se l’utente seleziona la regione Lombardia, il risultato mostrerà le vendite online della Lombardia, non tutte le vendite online del modello.
Il contesto di filtro è la parte che crea più confusione
Il contesto di filtro è l’insieme delle condizioni attive quando una misura viene calcolata. Può derivare da una segmentazione, da una riga di matrice, da un filtro pagina, da una relazione tra tabelle o direttamente dalla formula DAX.
Esiste anche il contesto di riga, cioè la situazione in cui DAX sta analizzando una riga specifica. CALCULATE può trasformare questo contesto in un contesto di filtro, un comportamento chiamato transizione di contesto. È uno dei motivi per cui la funzione è così importante nelle formule più avanzate.
Un errore tipico consiste nel pensare che una misura legga automaticamente una singola riga. Una misura lavora su un insieme filtrato di dati. Quando serve un calcolo riga per riga, uso funzioni iteratrici come SUMX:
Valore Vendite =
SUMX(
Vendite,
Vendite[Quantità] * Vendite[Prezzo Unitario]
)SUM somma una colonna già pronta, mentre SUMX valuta un’espressione per ogni riga e poi somma i risultati. La scelta corretta dipende dalla struttura dei dati, non dalla preferenza personale.
Quattro calcoli DAX utili in un report reale
Vendite per una condizione specifica
Per isolare un segmento, una categoria o un canale, una condizione diretta dentro CALCULATE è spesso la soluzione più leggibile:
Vendite Retail =
CALCULATE(
[Vendite Totali],
Vendite[Canale] = "Retail"
)Questo approccio è generalmente preferibile quando il filtro riguarda una sola colonna e una condizione semplice. Il codice rimane chiaro e il motore può gestire il filtro in modo efficiente.
Margine e margine percentuale
Per un margine economico creo prima i componenti di base:
Margine =
SUM(Vendite[Importo]) - SUM(Vendite[Costo])
Margine % =
DIVIDE(
[Margine],
[Vendite Totali],
0
)Uso DIVIDE invece dell’operatore `/` perché gestisce in modo sicuro i casi in cui il fatturato è zero o vuoto. Il terzo argomento permette di decidere cosa visualizzare in quella situazione, per esempio 0 o BLANK().
Confronto con l’anno precedente
Per i confronti temporali serve una tabella calendario con date continue e una relazione attiva con la tabella delle vendite. Una volta sistemato il modello, la misura può essere scritta così:
Vendite Anno Precedente =
CALCULATE(
[Vendite Totali],
SAMEPERIODLASTYEAR('Calendario'[Data])
)
Crescita Anno su Anno % =
DIVIDE(
[Vendite Totali] - [Vendite Anno Precedente],
[Vendite Anno Precedente],
0
)Se il confronto restituisce valori vuoti o incoerenti, controllo prima la tabella calendario, non la formula. Le cause più comuni sono date mancanti, relazione errata o filtro temporale non collegato alla tabella dei fatti.
Percentuale sul totale generale
Per calcolare il peso di una categoria sul totale complessivo devo rimuovere il filtro dalla categoria, mantenendo però gli altri filtri del report:
Quota sul Totale =
DIVIDE(
[Vendite Totali],
CALCULATE(
[Vendite Totali],
REMOVEFILTERS(Prodotti[Categoria])
),
0
)In questo modo, una riga relativa alla categoria “Computer” viene divisa per il totale di tutte le categorie, ma continua a rispettare eventuali filtri su anno, paese o canale. È proprio questo controllo selettivo del contesto a rendere CALCULATE più potente di una semplice somma.
Come controllare i filtri senza ottenere risultati ingannevoli
Non tutti i filtri si comportano allo stesso modo. Se inserisco una nuova condizione su una colonna già filtrata, Power BI può sostituire il filtro precedente. Se voglio aggiungere una condizione senza cancellare quella esistente, ricorro a KEEPFILTERS.
Vendite Prodotti Premium =
CALCULATE(
[Vendite Totali],
KEEPFILTERS(Prodotti[Segmento] = "Premium")
)Quando la condizione è complessa, posso usare FILTER:
Vendite Alto Valore =
CALCULATE(
[Vendite Totali],
FILTER(
Vendite,
Vendite[Importo] > 1000
)
)FILTER è flessibile, ma non lo uso automaticamente su tutta la tabella delle vendite. Su modelli grandi può costringere il motore a esaminare molte righe. Quando basta una condizione semplice su una colonna, preferisco la forma diretta dentro CALCULATE.
| Funzione | Effetto principale | Quando usarla |
|---|---|---|
| FILTER | Restituisce le righe che rispettano una condizione | Condizioni complesse o basate su più espressioni |
| REMOVEFILTERS | Rimuove uno o più filtri | Totali generali e percentuali sul totale |
| ALL | Ignora i filtri su una tabella o colonna | Scenari in cui serve un totale indipendente dal contesto |
| KEEPFILTERS | Mantiene e restringe i filtri già attivi | Segmentazioni più precise senza sostituire la selezione dell’utente |
Uso REMOVEFILTERS quando voglio rendere evidente l’intenzione della formula. ALL resta utile in molte espressioni DAX, ma il suo comportamento può essere meno intuitivo per chi deve mantenere il modello nel tempo.
Gli errori che falsano più spesso i calcoli
La misura restituisce sempre lo stesso totale
Se ogni riga di una matrice mostra lo stesso numero, verifico se nella formula ho usato ALL o REMOVEFILTERS sulla colonna visualizzata. Controllo anche che esista una relazione attiva tra la tabella contenente il campo della matrice e la tabella delle vendite.
Una colonna viene usata come se fosse un valore singolo
Una formula come questa può generare un errore:
Profitto = Vendite[Importo] - Vendite[Costo]In una misura, Power BI non sa quale riga scegliere. Posso risolvere aggregando i valori:
Profitto =
SUM(Vendite[Importo]) - SUM(Vendite[Costo])Oppure posso usare SUMX quando il calcolo deve avvenire riga per riga. La distinzione tra aggregazione e iterazione è fondamentale per evitare risultati apparentemente plausibili ma matematicamente sbagliati.
Il confronto temporale non funziona
Una funzione come SAMEPERIODLASTYEAR non può compensare un modello temporale costruito male. La tabella calendario dovrebbe contenere una riga per ogni data utile, essere collegata alla data della fact table e avere una colonna data realmente riconosciuta come tipo Date.
Leggi anche: Corso Power BI gratis - impara Power Query, modellazione e DAX
Il modello diventa lento
Le prime ottimizzazioni che applico sono semplici. Ridurre le colonne inutili, mantenere uno schema a stella, usare misure riutilizzabili e preferire filtri diretti a FILTER sull’intera tabella dei fatti produce spesso un miglioramento più concreto di una formula molto elaborata.
Per isolare i problemi creo anche misure temporanee, ad esempio il conteggio delle righe filtrate o il valore selezionato con SELECTEDVALUE. Così capisco se l’errore nasce dalla formula o dal modello dati.
La regola finale per scrivere DAX che resta comprensibile
Quando costruisco un calcolo in Power BI, seguo una sequenza precisa. Prima definisco una misura di base, poi la riutilizzo dentro CALCULATE e infine verifico come reagisce a filtri, righe e segmentazioni diverse.
- Creo una misura per ogni KPI dinamico.
- Uso colonne calcolate solo quando serve un valore stabile per ogni riga.
- Controllo sempre il modello e le relazioni prima di correggere la formula.
- Uso DIVIDE per percentuali e rapporti.
- Testo il risultato con una tabella semplice prima di inserirlo in un dashboard complesso.
Il passaggio decisivo non consiste nel memorizzare molte funzioni DAX, ma nel capire quale contesto deve vedere la misura. Quando questa logica è chiara, CALCULATE smette di sembrare una funzione misteriosa e diventa lo strumento più naturale per trasformare i dati in analisi utili.
