Può capitare di dover fare una TOP in Tableau senza poter però ricorrere né alla funzione Rank() della metrica, né al filtro TOP sulla dimension.
Ad esempio vogliamo fare una Nested TOP3 degli State all’interno di ogni Country e vogliamo anche i subtotals per ogni Country.
La Table Calculation Rank() ci permette di filtrare correttamente i primi 3 di ogni Country, ma i subtotals che vediamo non sono quello che ci aspetteremmo.
53.624 di Vienna + 10.383 di Carinthia + 6.219 di Tyrol = 70.225. Il total che vediamo è invece 81.162, che corrisponde al totale di tutta l’Austria.
Le Table Calculation usate come filtro funzionano così. La funzione Total() che è nascosta al di sotto dei totali somma tutte le righe di DB che fanno parte di ogni Country. Il filtro con la table calc viene eseguito in Tableau sul risultato della query (come tutte le table calc). Quindi il total viene calcolato prima del filtro sul rank.
Potremmo allora pensare di usare il filtro TOP sul campo combinato tra Country e State, ma non riuscremmo neanche a creare la Nested Top 3 (nested perché gli State sono dettaglio di Country).
E quindi, come si fa?
Si fa con le LOD!
Vediamo step by la logica.
Partendo dalla tabella iniziale, il primo in classifica corrisponde allo State che ha il valore massimo di Sales. Il secondo in classifica corrisponde al valore massimo di Sales, ma solo se non sei il primo. Il terzo in classifica corrisponde al max valore di Sales, ma solo se non sei né il primo, né il secondo.
Iniziamo a calcolare il MAX assoluto per ogni Country e a “stamparlo” su tutte le righe.
{ EXCLUDE [State] : MAX( { INCLUDE [Country],[State] : SUM([Sales] ) } ) }
Vienna è lo State che ha venduto di più e quindi stampiamo il suo valore su tutte le righe che riguardano Austria.
Antwerp è lo State che ha venduto di più e quindi stampiamo il suo valore su tutte le righe che riguardano Belgium.
E così via.
Creiamo adesso il calcolo per il MAX del secondo in classifica.
{ EXCLUDE [State] : MAX( { INCLUDE [Country],[State] : IF SUM([Sales])<SUM([Sales 1°] ) THEN SUM([Sales]) END } ) }
Carinthia è lo stato che ha venduto di più, escludendo il primo (IF SUM(Sales)<SUM(Sales 1°)) e quindi stampiamo il suo valore in tutte le righe che riguardano Austria.
Creiamo ora il caloclo per il MAX del terzo in classifica:
{ EXCLUDE [State] : MAX( { INCLUDE [Country], [State]: IF SUM([Sales]) < SUM([Sales 2°]) THEN SUM([Sales]) END })}
Tyrol è lo State che ha venduto di più, escludendo il secondo (IF SUM(Sales)<SUM(Sales 2°)) – e di conseguenza anche se è minore del primo – e quindi stampiamo il suo valore per tutte le righe che riguardano Austria.
Se dovessimo fare una TOP 5, potremmo andare avanti così, creando quindi 5 calcoli.
Possiamo terminare con un ultimo calcolo che crea il valore del ranking:
IF SUM([Sales])=SUM([Sales 1°]) then “1“
ELSEIF SUM([Sales])=SUM([Sales 2°]) then “2“
ELSEIF SUM([Sales])=SUM([Sales 3°]) then “3“
else “Escludi“
END
Possiamo ora utilizzare la voce “Escludi” del campo Rank come un filtro exclude ed avere la nostra TOP 3 che ci restituisce i subtotals corretti.