In una recente lezione di DAX a dei Dottori Commercialisti ed Esperti Contabili, mi è stato chiesto di mostrare come calcolare le vendite restringendone il calcolo al colore di prodotto (colonna ‘Product'[Color]) che mostra le massime vendite tra tutti i colori.
Il problema è generalizzabile ad una qualunque misura da calcolare in corrispondenza del valore di una qualunque colonna dimensionale che la massimizzi; dunque affronteremo per prima cosa il problema in termini astratti (essendo DAX, ciò vuol dire in termini di tabelle astratte), per poi andare nel concreto e risolvere il quesito. Infine, si mostreranno ulteriori possibili sviluppi e variazioni al calcolo.
In figura 1 è mostrato il modello dati usato.

Sviluppo
Un primo problema risiede nella definizione del calcolo: potrebbero esistere più valori massimizzanti. Inoltre, la richiesta che ho ricevuto non è precisa in termini di DAX perché non contestualizza il calcolo al 100%, spiego subito il perché. In figura 2 è visibile una matrice che mostra le vendite per anno.

Il calcolo richiesto potrebbe, in effetti, essere declinato in almeno due modi:
- calcolare le vendite restringendone il calcolo ai colori di prodotto che mostrano le massime vendite tra tutti i colori, nel filter context corrente, cioè nell’anno corrente nel caso particolare in figura 2;
- calcolare le vendite restringendone il calcolo ai colori di prodotto che mostrano le massime vendite tra tutti i colori, ignorando il filter context, cioè considerando sempre tutti gli anni nel caso particolare in figura 2.
In questo articolo seguiremo la strada del punto 1.
In termini astratti, i passi da seguire per ottenere quanto richiesto, con la specifica appena illustrata, sono i seguenti:
- elencare i valori della colonna di massimizzazione presenti nel filter context corrente;
- in corrispondenza di ognuno di essi, calcolare la misura nel filter context corrente;
- calcolare i valore massimo della misura tra quelli calcolati al punto 2;
- identificare i valori della colonna di massimizzazione che massimizzano la misura nel filter context corrente;
- calcolare la misura in corrispondenza dei valori della colonna di massimizzazione identificati al punto 4.
Nel caso in esame, la colonna di massimizzazione è ‘Product'[Color] e la misura è Vendite, il cui codice è a seguire:
Vendite =La misura che implementa i passi sopra riportati nel caso in esame è Vendite @ Colori Max Vendite il cui codice è mostrato qui di seguito. Si suggerisce ai lettori di identificare i passi elencati sopra nel codice della misura, un esercizio molto utile, e poi di provare a riformularla senza riguardare il codice qui proposto.
Vendite @ Colori Max Vendite =VALUES ( ‘Product'[Color] )
VAR ColoriVendite =
ADDCOLUMNS ( Colori, “@VenditeColore”, [Vendite] )
VAR MassimeVenditeColore =
MAXX ( ColoriVendite, [@VenditeColore] )
VAR ColoriConMassimeVendite =
FILTER ( ColoriVendite, [@VenditeColore] = MassimeVenditeColore )
VAR ColoriCheMassimizzanoLeVendite =
SELECTCOLUMNS (
ColoriConMassimeVendite,
“@ColoriMassimeVendite”, ‘Product'[Color]
)
RETURN
CALCULATE ( [Vendite], ‘Product'[Color] IN ColoriCheMassimizzanoLeVendite )
In figura 3 è mostrata la misura in opera.

Come accennato, ci sono molti possibili sviluppi e varianti al calcolo.
Tra gli sviluppi, cito subito la possibilità di mostrare in esplicito quali siano i colori considerati, come mostrato in figura 4:

Se questo sviluppo fosse di interesse, chiediamo ai lettori di indicarlo nei commenti (e di provare a risolvere il problema da soli per esercizio) e sarà fornito il codice in un altro articolo a stretto giro.
Come variante al calcolo, si può subito pensare ad una già citata: calcolare le vendite restringendone il calcolo al colore di prodotto che mostra le massime vendite tra tutti i colori, ma ignorando il filter context.
Conclusioni
Ragionando per tabelle e passi, e usando le variabili per rendere il codice leggibile e facilmente testabile in ogni suo punto, il calcolo richiesto è stato risolto senza grandi difficoltà (il codice non è, in effetti, complesso).
Tuttavia, si ricordi che, per prima cosa, va capito cosa veramente ci viene chiesto ed è necessario andare nello specifico della definizione per essere certi che sia precisa, come mostrato in questo articolo.
Risolvere i problemi in DAX in modo astratto è condizione sine qua non per un implementazione efficiente ed efficace del calcolo vero e proprio. Si sconsiglia vivamente di iniziare a scrivere codice prima di avere un piano preciso di passi da seguire. Più si diventa esperti, più alcuni passi sono immediati; tuttavia mi sento in dovere di segnalare che, dopo oltre dieci anni di scrittura di DAX, io stesso procedo ancora così. Se non lo si fa ed il problema è relativamente complesso, si rischia di perdere tempo e di farlo perdere ai clienti.
My 2 cents: non esistono scorciatoie in DAX.