Quando un report Power BI mostra un totale corretto ma non risponde alla domanda aziendale, il problema spesso non è il dato, bensì il modo in cui viene applicato il filtro. La funzione CALCULATE in DAX permette di ricalcolare una misura in condizioni diverse, per esempio solo per l’Italia, per il 2025 o senza il filtro su una determinata categoria.
Il punto decisivo è modificare il contesto di filtro con precisione
- CALCULATE valuta un’espressione applicando filtri nuovi o modificati.
- La base più solida è una misura semplice, come la somma delle vendite.
- KEEPFILTERS, REMOVEFILTERS e ALLSELECTED producono risultati diversi.
- Il modello deve avere relazioni corrette e una tabella calendario ben configurata.
- La maggior parte degli errori nasce dalla confusione tra contesto di riga e contesto di filtro.

Che cosa fa davvero CALCULATE in DAX
La sintassi di base è semplice:
CALCULATE (
,
,
) La funzione prende un’espressione, di solito una misura, e la valuta in un contesto di filtro modificato. È il principio descritto anche da Microsoft Learn, ed è il motivo per cui CALCULATE compare in tantissime misure Power BI.
Immaginiamo una tabella chiamata Vendite con una colonna Importo e una tabella Clienti con la colonna Paese. La prima misura dovrebbe rimanere essenziale:
Vendite totali =
SUM ( Vendite[Importo] )Da questa base si possono costruire domande più utili:
Vendite Italia =
CALCULATE (
[Vendite totali],
Clienti[Paese] = "Italia"
)In una scheda filtrata sulla Lombardia, la misura continuerà a rispettare il contesto geografico esistente, ma restringerà il calcolo ai clienti italiani. La relazione tra Clienti e Vendite deve però essere attiva e configurata correttamente, altrimenti il filtro potrebbe non raggiungere la tabella dei fatti.
Nel mio modo di lavorare, CALCULATE non è una funzione da aggiungere automaticamente a ogni formula. La uso quando voglio rendere esplicita una domanda analitica: quanto vendiamo in una condizione diversa da quella attuale?
Come costruire misure utili partendo da un esempio
Filtrare per anno o area geografica
Un filtro diretto è la scelta più leggibile quando la condizione riguarda una sola colonna:
Vendite 2025 =
CALCULATE (
[Vendite totali],
Calendario[Anno] = 2025
)Lo stesso approccio funziona per canale, segmento cliente, regione o prodotto. Se il report usa la lingua italiana o impostazioni locali diverse, il separatore degli argomenti può essere la virgola oppure il punto e virgola. Il modello deve usare il separatore previsto dalla configurazione di Power BI.
Calcolare una quota sul totale
Una richiesta frequente è confrontare le vendite della categoria selezionata con tutte le categorie:
Quota categoria =
DIVIDE (
[Vendite totali],
CALCULATE (
[Vendite totali],
REMOVEFILTERS ( Prodotti[Categoria] )
)
)REMOVEFILTERS elimina il filtro sulla categoria solo nel denominatore. Il numeratore resta influenzato dalla selezione dell’utente, mentre il denominatore rappresenta il totale di riferimento. DIVIDE è preferibile alla semplice divisione perché gestisce in modo sicuro il caso in cui il denominatore sia zero.
Confrontare il periodo precedente
Per analizzare l’andamento nel tempo serve una tabella calendario collegata alla data delle vendite:
Vendite anno precedente =
CALCULATE (
[Vendite totali],
SAMEPERIODLASTYEAR ( Calendario[Data] )
)
Crescita percentuale =
DIVIDE (
[Vendite totali] - [Vendite anno precedente],
[Vendite anno precedente]
)Se la tabella calendario contiene date mancanti o non è impostata come tabella data, il confronto può produrre risultati incompleti. È un dettaglio che molti trascurano: la formula può essere corretta e il risultato comunque sbagliato se il modello temporale non lo è.
Filtri DAX che cambiano completamente il risultato
La difficoltà non sta nella parentesi di CALCULATE, ma nel capire che cosa succede ai filtri già presenti. In generale, un filtro applicato sulla stessa colonna può sostituire il filtro esistente. Per controllare il comportamento, conviene conoscere queste funzioni.
| Funzione | Uso principale | Quando sceglierla |
|---|---|---|
KEEPFILTERS |
Mantiene e restringe i filtri esistenti | Quando non vuoi sovrascrivere una selezione dell’utente |
REMOVEFILTERS |
Rimuove filtri da colonne o tabelle | Per totali di riferimento e percentuali sul totale |
ALL |
Rimuove filtri e può restituire una tabella | In scenari più articolati, soprattutto con funzioni iteratore |
ALLSELECTED |
Conserva i filtri esterni alla visualizzazione | Per totali visivi e confronti con la selezione corrente |
FILTER |
Costruisce un filtro riga per riga | Per condizioni complesse che non si esprimono con un filtro diretto |
Per esempio, questa misura conserva i filtri già applicati e aggiunge il vincolo sulla marca:
Vendite marca Alba =
CALCULATE (
[Vendite totali],
KEEPFILTERS ( Prodotti[Marca] = "Alba" )
)Se la condizione è semplice, preferisco un filtro diretto. FILTER diventa utile quando devo valutare una misura o più colonne:
Vendite prodotti redditizi =
CALCULATE (
[Vendite totali],
FILTER (
Prodotti,
Prodotti[Margine] > 0.30
)
)Usare FILTER ovunque è una cattiva abitudine. Su modelli grandi può rendere il calcolo più pesante, mentre un filtro diretto è spesso più chiaro e più efficiente. La complessità della condizione deve giustificare la complessità della formula.
Contesto di filtro e contesto di riga senza confusione
Il contesto di filtro arriva da slicer, filtri pagina, filtri visualizzazione, relazioni e filtri scritti nella misura. Il contesto di riga, invece, identifica la riga corrente quando si lavora con una colonna calcolata o con funzioni come SUMX.
Un esempio chiarisce il passaggio:
Vendite per cliente =
SUMX (
Clienti,
CALCULATE ( [Vendite totali] )
)SUMX scorre i clienti uno alla volta. CALCULATE trasforma la riga corrente in un filtro, un comportamento chiamato transizione del contesto. Senza questa trasformazione, la misura potrebbe non sapere quale cliente deve considerare durante ogni iterazione.
Questa distinzione spiega molti risultati apparentemente inspiegabili. Una misura reagisce dinamicamente al contesto del visual, mentre una colonna calcolata viene calcolata durante il caricamento o l’aggiornamento del modello. Per analisi interattive preferisco quasi sempre le misure, perché non duplicano dati e rispondono alle selezioni dell’utente.
Le colonne calcolate hanno comunque senso quando il valore deve esistere riga per riga, per esempio una classificazione stabile del cliente o una chiave utilizzata in una relazione. Usarle per ogni aggregazione può aumentare le dimensioni del modello senza offrire un vantaggio reale.
Gli errori più comuni quando si calcolano misure
La relazione non filtra la tabella delle vendite
Se Clienti[Paese] non modifica il risultato delle vendite, controllo prima il modello e solo dopo la formula. Una relazione inattiva, una direzione di filtro non adatta o chiavi duplicate nella tabella dimensionale possono interrompere il percorso del filtro.
Il filtro sostituisce una selezione importante
Una misura con Prodotti[Marca] = "Alba" può sovrascrivere una selezione già presente sulla marca. Se l’obiettivo è aggiungere una condizione e non sostituire quella esistente, KEEPFILTERS è spesso la soluzione corretta.
Il totale generale sembra incoerente
Il totale di una tabella non è sempre la somma visiva delle righe. Power BI può ricalcolare la misura nel contesto del totale, senza sommare i risultati mostrati sopra. Questo accade spesso con percentuali, medie ponderate e misure che usano iteratori.
Leggi anche: Data model Power BI - relazioni solide, DAX e report affidabili
La misura contiene troppa logica insieme
Per rendere il calcolo verificabile, uso variabili e misure di base separate:
Margine percentuale =
VAR Ricavi = [Vendite totali]
VAR Costi = [Costi totali]
VAR Margine = Ricavi - Costi
RETURN
DIVIDE ( Margine, Ricavi )Le variabili migliorano la leggibilità e aiutano a controllare ogni passaggio. Quando una misura supera una certa complessità, la prima cosa che faccio è dividerla in componenti testabili, non aggiungere altre funzioni alla formula originale.
Un metodo pratico per verificare ogni formula
- Crea una misura base, ad esempio la somma delle vendite.
- Inseriscila in una tabella insieme alle colonne che dovrebbero filtrarla.
- Aggiungi CALCULATE con un solo filtro alla volta.
- Confronta il risultato con un totale noto o con un calcolo indipendente.
- Verifica il comportamento nei dettagli, nei subtotali e nel totale generale.
- Solo dopo aggiungi funzioni come FILTER, ALLSELECTED o iteratori.
Per un modello commerciale italiano, una matrice con anno, regione e categoria è un buon banco di prova. Se la misura funziona nel dettaglio ma non nel totale, il problema è spesso nella logica del contesto, non nei dati di origine.
Per analisi più avanzate si possono usare strumenti di diagnostica come Performance Analyzer o DAX Studio. Non servono per iniziare, ma diventano preziosi quando una misura è lenta o quando più relazioni influenzano lo stesso risultato.
La documentazione di Microsoft Learn tratta CALCULATE insieme ai concetti di contesto e modello. È un ordine sensato anche nello studio personale: prima si capisce quale filtro dovrebbe arrivare al dato, poi si ottimizza la sintassi.
La misura giusta nasce dal modello, non dalla formula più lunga
Per usare bene CALCULATE non serve memorizzare decine di funzioni. Serve sapere quale risultato vuoi ottenere, quali filtri devono restare attivi e quali invece devono essere rimossi.
Partire da misure semplici, usare un calendario affidabile e testare ogni modifica in un visual riduce drasticamente gli errori. La mia regola pratica è questa: se non riesci a spiegare in una frase quale contesto sta cambiando, la misura non è ancora abbastanza chiara.
