• Power BI e DAX
  • Calcoli DAX in Power BI - misure, filtri e CALCULATE

Calcoli DAX in Power BI - misure, filtri e CALCULATE

Emilio Santoro 4 giugno 2026
Grafico Power BI che mostra l'indice di sviluppo umano per paese e anno. Filtro attivo per "is Portugal".

Indice

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.

Dashboard web analytics: visualizza dati per calcolare Power BI, con total page views, sessioni, bounce rate e conversioni per paese e dispositivo.

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.

Domande frequenti

Una misura viene calcolata quando il report viene visualizzato e reagisce a filtri, segmentazioni e righe della matrice. Una colonna calcolata viene valutata riga per riga durante il refresh e mantiene un valore stabile, quindi è adatta a classificazioni e valori necessari per ogni riga, non a KPI dinamici.

CALCULATE valuta un’espressione aggiungendo, sostituendo o rimuovendo filtri. Per esempio, può calcolare le vendite online mantenendo il filtro sulla regione. KEEPFILTERS mantiene e restringe i filtri già attivi, mentre REMOVEFILTERS consente di calcolare un totale ignorando una colonna specifica.

SUM somma una colonna già pronta, mentre SUMX valuta un’espressione riga per riga e poi somma i risultati, come quantità moltiplicata per prezzo unitario. DIVIDE è preferibile all’operatore / per gestire in sicurezza fatturati nulli o pari a zero e definire un risultato alternativo.

È necessaria una tabella calendario con date continue, collegata tramite una relazione attiva alla data della tabella delle vendite. La colonna deve essere riconosciuta come tipo Date. Date mancanti, relazioni errate o filtri temporali non collegati possono rendere incoerente SAMEPERIODLASTYEAR.

Valuta l'articolo

Valutazione: 0.00 Numero di voti: 0

Tag

misure
calculate
filtri
calendario
sumx
Autor Emilio Santoro
Emilio Santoro
Mi chiamo Emilio Santoro e mi occupo di analisi dati, business intelligence e data science da 4 anni. Ho iniziato a esplorare questo mondo perché sono affascinato dal potenziale dei dati nel trasformare le decisioni aziendali e nel fornire una comprensione più profonda dei fenomeni. Sul sito mondobi.it, cerco di rendere accessibili concetti complessi, condividendo la mia esperienza nel collegare la teoria alla pratica e nel presentare informazioni in modo chiaro e organizzato. La mia priorità è offrire contenuti accurati, utili e sempre aggiornati, basati su un'attenta verifica delle fonti e un confronto costante con le tendenze del settore.

Condividi post

Scrivi un commento