La differenza principale tra SUM, SUMX e CALCULATE in DAX (Data Analysis Expressions) è nelle loro funzioni fondamentali e negli scopi per cui vengono utilizzate Spiegherò queste funzioni con esempi pratici.
SUM, SUMX, CALCULATE
SUM
SUM(<column>)
- È un aggregatore semplice che somma i valori di una colonna
- Opera direttamente sui valori della colonna stessa
- Non permette calcoli complessi durante la somma
SUMX
SUMX(<table>, <expression>)
- È una funzione iterativa che valuta un'espressione per ogni riga di una tabella
- Permette calcoli complessi a livello di riga prima di eseguire la somma
- Offre maggiore flessibilità rispetto a SUM
CALCULATE
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
- È una funzione che valuta un'espressione in un contesto modificato da filtri
- Formula: CALCULATE(espressione, filtro1, filtro2, ...)
- Utilizzata principalmente per modificare il contesto di valutazione di un'espressione
Esempi pratici
Esempio di SUM
Immaginiamo una tabella Vendite con queste colonne:
- Prodotto
- Quantità
- Prezzo
Per calcolare il totale delle quantità vendute:
TotaleQuantità = SUM(Vendite[Quantità])
Questo semplicemente somma tutti i valori nella colonna Quantità.
Esempio di SUMX
Per calcolare il fatturato totale (Quantità × Prezzo per ogni riga):
FatturatoTotale = SUMX(Vendite, Vendite[Quantità] * Vendite[Prezzo])
In questo caso SUMX:
- Itera su ogni riga della tabella Vendite
- Per ogni riga, moltiplica Quantità × Prezzo
- Somma tutti i risultati ottenuti
Esempio più avanzato di SUMX
Calcolo del fatturato solo per prodotti con margine positivo:
FatturatoMarginePositivo =
SUMX(
FILTER(Vendite, Vendite[Prezzo] > Vendite[Costo]),
Vendite[Quantità] * Vendite[Prezzo]
)
Qui SUMX lavora su una tabella filtrata e calcola il fatturato solo per i prodotti con prezzo maggiore del costo.
La differenza fondamentale sta nella capacità di SUMX di valutare espressioni complesse per ogni riga prima di eseguire la somma, mentre SUM opera solo sui valori di una singola colonna.
Esempio di CALCULATE
Per calcolare il fatturato totale solo dei prodotti nella categoria "Elettronica":
FatturatoElettronica =
CALCULATE(
SUM(Vendite[Importo]),
Prodotti[Categoria] = "Elettronica"
)
In questo caso CALCULATE modifica il contesto di valutazione di SUM(Vendite[Importo]) applicando un filtro sulla categoria dei prodotti.
Esempio combinato
Calcolo del fatturato di prodotti elettronici venduti nel 2023:
FatturatoElettronica2023 =
CALCULATE(
SUMX(Vendite, Vendite[Quantità] * Vendite[Prezzo]),
Prodotti[Categoria] = "Elettronica",
YEAR(Vendite[Data]) = 2023
)
Qui combiniamo le due funzioni:
- SUMX calcola il fatturato riga per riga (Quantità × Prezzo)
- CALCULATE modifica il contesto applicando due filtri: categoria "Elettronica" e anno 2023
Esempio avanzato
Calcolo della differenza percentuale nel fatturato rispetto all'anno precedente:
VariazioneFatturato =
DIVIDE(
CALCULATE(
SUM(Vendite[Importo]),
YEAR(Vendite[Data]) = 2023
),
CALCULATE(
SUM(Vendite[Importo]),
YEAR(Vendite[Data]) = 2022
)
) - 1
In questo esempio, CALCULATE viene utilizzato due volte per creare due diversi contesti di filtro (2023 e 2022) per poi confrontare i risultati.
In sintesi, SUMX è principalmente una funzione di aggregazione che lavora riga per riga, mentre CALCULATE è una funzione di modificazione del contesto che permette di alterare l'ambiente in cui vengono valutate le espressioni DAX.




