Quando un report Power BI deve mostrare la posizione di prodotti, clienti o venditori, una semplice somma non basta: serve capire chi è primo, chi segue e rispetto a quale insieme. RANKX in DAX permette di costruire classifiche dinamiche, sensibili ai filtri del report, gestendo anche parità, ordine crescente o decrescente e classifiche per gruppo. Qui mostro la sintassi, gli esempi più utili e gli errori che più spesso producono risultati apparentemente sbagliati.
La logica essenziale per creare classifiche affidabili in Power BI
- RANKX assegna una posizione valutando un’espressione su una tabella.
- La scelta tra ALL, ALLSELECTED e VALUES determina il perimetro della classifica.
- DESC mette il valore più alto al primo posto, mentre ASC parte dal più basso.
- DENSE evita i buchi dopo una parità; SKIP li mantiene.
- Molti errori dipendono dal contesto di filtro, non dalla funzione in sé.
Che cosa fa davvero RANKX
RANKX confronta il valore corrente con i valori ottenuti da un’espressione applicata a una tabella. In pratica, costruisce una graduatoria ogni volta che la misura viene calcolata nel visual. La classifica, quindi, non è necessariamente fissa: può cambiare quando l’utente seleziona un anno, una regione o una categoria.
La sintassi generale è la seguente:
RANKX(
,
,
[],
[],
[]
)
Il primo argomento indica l’insieme degli elementi da confrontare. Il secondo contiene il valore da classificare, spesso una misura come il fatturato totale. Il parametro value è facoltativo e serve quando vogliamo confrontare un valore specifico; nella maggior parte delle classifiche interattive lo lasciamo vuoto.
L’ordine può essere DESC, il valore più alto riceve il rango 1, oppure ASC, dove il valore più basso arriva primo. L’ultimo argomento gestisce le parità con SKIP o DENSE. Personalmente preferisco indicarlo sempre, perché rendere esplicita questa scelta evita ambiguità quando il report passa di mano.
Una misura di base
Vendite totali =
SUM ( Vendite[Importo] )
Classifica prodotto =
RANKX (
ALL ( Prodotti[Prodotto] ),
[Vendite totali],
,
DESC,
DENSE
)
Con questa formula ogni prodotto viene confrontato con tutti i prodotti, indipendentemente dal prodotto visualizzato nella riga della tabella. Il risultato è una posizione numerica, utile per ordinare un visual, filtrare i primi elementi o evidenziare il prodotto più performante.
La tabella del primo argomento decide il significato del ranking
La parte più delicata non è scrivere RANKX, ma decidere chi deve partecipare alla gara. Usare la tabella sbagliata può produrre una misura formalmente corretta ma concettualmente inutile.
Espressione
Effetto
Quando usarla
ALL
Rimuove i filtri dalla colonna o dalla tabella indicata
Classifica globale, indipendente dal filtro sull’elemento
ALLSELECTED
Mantiene le selezioni effettuate dall’utente nel report
Ranking relativo all’intervallo o al segmento selezionato
VALUES
Restituisce i valori presenti nel contesto attuale
Confronti limitati al gruppo o alla selezione corrente
FILTER
Permette di definire condizioni personalizzate
Esclusione di prodotti inattivi, righe vuote o categorie specifiche
Classifica globale e classifica filtrata
Classifica globale =
RANKX (
ALL ( Prodotti[Prodotto] ),
[Vendite totali],
,
DESC,
SKIP
)
Classifica nella selezione =
RANKX (
ALLSELECTED ( Prodotti[Prodotto] ),
[Vendite totali],
,
DESC,
DENSE
)
La prima misura continua a confrontare il prodotto con l’intero catalogo. La seconda considera invece solo i prodotti rimasti nella selezione dell’utente. Se il report mostra un grafico con l’anno 2026 selezionato, ALLSELECTED è spesso la scelta più intuitiva per una classifica “tra quelli visualizzati”.
Un errore frequente consiste nell’usare ALL ( Prodotti ) quando si voleva rimuovere soltanto il filtro sul nome del prodotto. In quel caso possono sparire anche filtri utili, come marca o categoria. Io parto quasi sempre dalla colonna precisa e allargo alla tabella completa solo quando la logica del report lo richiede davvero.
Come gestire parità, ordine e valori mancanti
Due prodotti possono avere lo stesso fatturato, quindi il ranking deve stabilire cosa succede dopo una parità. Con SKIP, se due elementi condividono il primo posto, il successivo sarà terzo. Con DENSE, invece, il ranking prosegue senza buchi.
Valore
SKIP
DENSE
1.000
1
1
1.000
1
1
800
3
2
600
4
3
SKIP rappresenta bene una graduatoria sportiva, perché il terzo posto arriva dopo due concorrenti classificati primi. DENSE è più comodo nei report gestionali, soprattutto quando vogliamo visualizzare “i primi 3 ranghi” senza perdere il terzo livello a causa di una parità.
Per valori mancanti o misure che restituiscono BLANK, è prudente controllare il comportamento del modello. Nelle espressioni numeriche i valori vuoti possono essere trattati come zero, con il rischio di includere nel ranking prodotti senza vendite. Una protezione semplice può essere:
Classifica prodotto =
IF (
ISBLANK ( [Vendite totali] ),
BLANK (),
RANKX (
ALL ( Prodotti[Prodotto] ),
[Vendite totali],
,
DESC,
DENSE
)
)
Questa variante evita di mostrare una posizione per elementi privi di dati. È una piccola aggiunta, ma migliora molto la leggibilità delle tabelle operative.
Ranking per categoria, area o altro gruppo
Una classifica globale non risponde sempre alla domanda giusta. Un responsabile commerciale potrebbe voler sapere la posizione di ogni prodotto all’interno della propria categoria, non rispetto a tutto il catalogo.
Classifica nella categoria =
RANKX (
ALLEXCEPT (
Prodotti,
Prodotti[Categoria]
),
[Vendite totali],
,
DESC,
DENSE
)
ALLEXCEPT rimuove i filtri dalla tabella, ma conserva quello sulla categoria. Così un prodotto della categoria “Notebook” viene confrontato con gli altri notebook, mentre un prodotto della categoria “Monitor” appartiene a un ranking diverso.
Per classifiche più controllate si può usare FILTER. Per esempio, si possono escludere i prodotti disattivati:
Classifica prodotti attivi =
RANKX (
FILTER (
ALL ( Prodotti[Prodotto], Prodotti[Stato] ),
Prodotti[Stato] = "Attivo"
),
[Vendite totali],
,
DESC,
DENSE
)
Qui il punto importante è il modello dati. Se categoria, area e prodotto arrivano da una tabella dimensionale collegata correttamente alla tabella dei fatti, il ranking sarà più stabile e comprensibile. Quando le relazioni sono ambigue o mancanti, nessuna variante della formula può correggere completamente il risultato.
Gli errori che fanno sembrare RANKX “sbagliato”
La misura restituisce sempre 1
Di solito significa che il primo argomento contiene un solo elemento nel contesto corrente. Controllerei subito se è stata usata una colonna già filtrata o se un filtro del visual sta restringendo la tabella più del previsto. In molti casi la correzione consiste nel passare da VALUES a ALL o ALLSELECTED.
Il ranking ignora i filtri del report
Questo accade spesso con ALL, che rimuove deliberatamente i filtri dall’insieme indicato. Se la classifica deve reagire alle selezioni dell’utente, ALLSELECTED è generalmente più adatto, anche se il comportamento dipende dalla struttura del visual e dai filtri applicati.
Il risultato non segue le vendite della riga
Il secondo argomento deve valutare correttamente la misura per ogni elemento della tabella. Una misura come [Vendite totali] normalmente gestisce il passaggio dal contesto di riga al contesto di filtro, mentre un’espressione scritta in modo incompleto potrebbe non farlo. In questi casi verifico la misura isolatamente e, se serve, uso CALCULATE per rendere esplicita la valutazione.
Compaiono numeri decimali inattesi
Confronti su numeri decimali possono risentire di piccole differenze di precisione. Due valori mostrati entrambi come 100,00 potrebbero non essere identici internamente. Se la logica lo consente, conviene classificare una misura arrotondata oppure normalizzare i dati prima del calcolo.
Leggi anche: Power BI API e DAX per integrare dati, report e automazioni
La classifica è corretta ma il visual sembra ordinato male
Il ranking non crea automaticamente un ordinamento visivo coerente. Bisogna verificare la colonna usata per il sort e la direzione dell’ordinamento. Inoltre, in presenza di parità, RANKX assegna lo stesso numero a più elementi, quindi non può stabilire da solo quale riga debba apparire prima.
Una strategia pratica per validare la misura
Prima di usare il ranking in una card o in un filtro Top N, lo inserisco in una tabella insieme a nome dell’elemento, valore misurato e posizione. È il modo più rapido per vedere se l’insieme confrontato, l’ordine e la gestione delle parità corrispondono davvero all’obiettivo.
- Creo e verifico la misura di base, per esempio il fatturato totale.
- Inserisco la dimensione da classificare in una tabella del report.
- Aggiungo la misura RANKX e controllo almeno i primi, gli ultimi e un caso di parità.
- Applico un filtro su anno, area o categoria per verificare il comportamento dinamico.
- Scelgo
SKIP o DENSE in base all’uso reale della graduatoria.
Per grandi modelli, la semplicità della misura conta. Una tabella di confronto molto ampia, combinata con espressioni complesse e molti filtri, può aumentare il lavoro del motore DAX. In presenza di rallentamenti, misuro prima le prestazioni e valuto se ridurre l’insieme con una dimensione più precisa o spostare parte della preparazione in Power Query.
Dal ranking alla decisione nel report
RANKX dà il meglio quando la posizione non resta un numero isolato, ma guida una lettura. Posso usarla per evidenziare i primi cinque prodotti, mostrare la variazione di posizione tra due periodi o costruire una misura che visualizzi solo gli elementi sopra una determinata soglia.
Top 5 prodotto =
IF (
[Classifica prodotto] <= 5,
[Vendite totali],
BLANK ()
)
Questa misura è semplice, ma va interpretata con attenzione. In presenza di parità, cinque ranghi potrebbero corrispondere a più di cinque prodotti, soprattutto con DENSE. Se serve un numero esatto di righe, occorre definire anche un criterio di spareggio, per esempio un codice prodotto univoco o una seconda misura.
La mia regola è questa: prima definisco il significato di “primo”, poi scrivo la formula. Un ranking globale, uno relativo alla selezione e uno interno alla categoria sono tre risultati diversi, anche quando usano la stessa funzione. La qualità del report dipende soprattutto da questa scelta semantica.
La scelta decisiva resta il perimetro del confronto
Una misura RANKX ben costruita combina una tabella di confronto corretta, una misura affidabile e una gestione esplicita delle parità. Nella pratica, gli errori più costosi nascono dall’uso inconsapevole di ALL o dalla confusione tra ranking globale e ranking filtrato.
Per partire con una base solida, userei ALLSELECTED quando la classifica deve seguire l’esperienza dell’utente, ALL per un confronto assoluto e ALLEXCEPT per il ranking dentro un gruppo. Testare questi tre scenari su una tabella di controllo richiede pochi minuti e spesso evita ore di correzioni su visual più complessi.
