• Power BI e DAX
  • RANKX in DAX per classifiche dinamiche in Power BI

RANKX in DAX per classifiche dinamiche in Power BI

Gavino Caputo 25 aprile 2026
Codice DAX per RANKX che calcola la classifica per paese. La tabella mostra le vendite classificate per paese.

Indice

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.

  1. Creo e verifico la misura di base, per esempio il fatturato totale.
  2. Inserisco la dimensione da classificare in una tabella del report.
  3. Aggiungo la misura RANKX e controllo almeno i primi, gli ultimi e un caso di parità.
  4. Applico un filtro su anno, area o categoria per verificare il comportamento dinamico.
  5. 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.

Domande frequenti

ALL crea una classifica globale rimuovendo i filtri dall’insieme indicato. ALLSELECTED mantiene le selezioni dell’utente, mentre VALUES limita il confronto ai valori presenti nel contesto corrente, utile per classifiche all’interno di un gruppo o di una selezione.

SKIP mantiene i buchi nella graduatoria: se due prodotti sono primi, il successivo è terzo. DENSE assegna invece il rango 2 al valore successivo, quindi è spesso più pratico nei report gestionali e nei filtri sui primi ranghi.

Si può usare ALLEXCEPT mantenendo il filtro sulla colonna della categoria. Ad esempio, ALLEXCEPT(Prodotti, Prodotti[Categoria]) confronta ogni prodotto solo con gli altri prodotti della stessa categoria.

Il risultato può essere sempre 1 quando la tabella del primo argomento contiene un solo elemento nel contesto corrente. Se il ranking deve seguire le selezioni dell’utente, ALL può essere sostituito da ALLSELECTED; è inoltre utile verificare i filtri del visual e la misura valutata.

Valuta l'articolo

Valutazione: 0.00 Numero di voti: 0

Tag

rankx
classifiche
contesto di filtro
parità
top n
Autor Gavino Caputo
Gavino Caputo
Mi chiamo Gavino Caputo e da 14 anni mi occupo con passione di analisi dati, Business Intelligence e Data Science. Ho iniziato questo percorso perché sono sempre stato affascinato dalla possibilità di trasformare grandi volumi di informazioni in conoscenza utile e fruibile. Sul sito mondobi.it, il mio obiettivo è quello di rendere accessibili concetti complessi, condividendo la mia esperienza per aiutare a comprendere meglio il mondo dei dati, le sue applicazioni e le tendenze emergenti. Cerco di fornire contenuti accurati e aggiornati, spiegando i temi in modo chiaro e strutturato, basandomi su un confronto costante tra le diverse fonti e metodologie che incontro nel mio lavoro quotidiano.

Condividi post

Scrivi un commento