Salta al contenuto

Come calcolare una misura in corrispondenza dei valori di una colonna dimensionale che la massimizzano

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.

Figura 1

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.

Figura 2

Il calcolo richiesto potrebbe, in effetti, essere declinato in almeno due modi:

  1. 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;
  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:

  1. elencare i valori della colonna di massimizzazione presenti nel filter context corrente;
  2. in corrispondenza di ognuno di essi, calcolare la misura nel filter context corrente;
  3. calcolare i valore massimo della misura tra quelli calcolati al punto 2;
  4. identificare i valori della colonna di massimizzazione che massimizzano la misura nel filter context corrente;
  5. 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 =
SUMX ( Sales, Sales[UnitPrice] * Sales[OrderQuantity] )

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 =
VAR Colori =
    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.

Figura 3

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:

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.

Autore del Post

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *