Uscire dal contesto (dopo averlo capito, però)

Una delle cose più difficili da capire per chi si avvicina a DAX, magari arrivando da conoscenze di mondi “relazionali”, è il concetto di contesto.

Prendiamo ad esempio una tabella pivot banale creata da un elenco di ordini dove abbiamo data, articolo, e quantità, per esempio, una cosa stile quella di seguito:

Ecco, per effetto della “visualizzazione” DAX si troverà a che fare con numerosi contesti.

Identifichiamoli insieme:

  • ogni incrocio riga/colonna è una fetta della nuvola dati che rappresenta un sottoinsieme delle informazioni;
  • ogni totale di riga e ogni totale di colonna è anch’essa una fetta della stessa nuvola dati

Tutte queste fettine di informazioni si chiamano contesti e ogni volta che voi chiedete a DAX di farvi dei calcoli, per esempio fare la somma o la media di un valore, DAX lo farà ESCLUSIVAMENTE su quella fettina di dati applicando dei filtri, nell’esempio per i calcoli delle celle DAX applicherà un filtro al campo Giorno e un filtro al campo Articolo.

Nella tabella dopra, utilizzando PowerBI, è abbastanza semplice trasformare i valori in percentuali del totale o della riga o della colonna, ma guardiamo la seguente:

Se in questa tabella volessimo esprimere una percentuale riferita al totale del mese, dovremmo ricorrere necessariamente a DAX.

La % del mese potrebbe essere una cosa del tipo “SUM(Quantità)/SUM(Quantità)[Del mese]

Il numeratore è il calcolo standard, ma il denominatore è un calcolo che deve “derogare dal contesto”, deve cioè poter uscire dal limite della fettina che il visual sta valutando per la rappresentazione.

La deroga è contentita dal costrutto CALCULATE().

Proviamo a scrivere la formula che valuti il totale della percentuale del mese (anno e mese per la precisione):

sono in un contesto di giorno giorno, fai somma le vendite di tutti i giorni il cui anno è l’anno del giorno e il mese è il mese del giorno.

Nella formula useremo le variabili per calcolare l’anno e il mese del giorno; la formula che useremo è la seguente (poi la spieghiamo):

Iniziamo dal CALCULATE: la formula inizia dicendo a DAX che noi vogliamo MODIFICARE il contesto per la valutazione di una formula.

La prima parte del costrutto è la formula che vogliamo valutare, che è la somma della quantità.

La seconda parte del costrutto, in realtà le parti seguenti perchè potrebbero essere più di una, sono le deroghe ai filtri di contesto e qui ci soffermeremo.

FILTER è l’istruzione che AGGIUNGE filtri al contesto, con FILTER noi possiamo restringere la fettina dei dati da valutare imponendo ulteriori filtri a quelli di contesto; FILTER ha due sezioni come CALCULATE: la prima è la tabella a cui imporre i filtri, la seconda è l’insieme dei filtri da applicare.

Nel nostro caso noi voglia TOGLIERE il filtro giorno perchè vogliamo applicare il filtro anno e mese.

Nella prima parte della formula abbiamo calcolato l’anno e il mese da usare come filtro:

Nella sezione FILTER abbiamo detto a DAX: so che forse hai i giorni filtrati e che mi stai valutando su un giorno o un insieme di giorni, magari una settimana, ma io voglio che tu li prenda tutti togliendo qualsiasi filtro sia imposto dal contesto di valutazione al campo Giorno; glielo abbiamo detto qui:

Nel costrutto FILTER abbiamo poi applicato i filtri dicendo di prendere tutti i valori dei giorni che sono dell’anno e del mese che vogliamo valutare:

A questo punto se volessi includere il calcolo nella tabella di prima otterremmo:

Ci resta da risolvere il problema del 24 contro 49 delle righe articolo, ma questo lo vediamo qui sotto.

La formula deve essere valida solo se i dati che guardo sono riferiti solo a un singolo mese; ci inventiamo qualche cosa tipo calcolare anche il minimo del mese o dell’anno e filtrare anche per questi.

La formula potrebbe essere quindi tipo questa:

Questa strategia di filtro evita di valutare la somma laddove ci siano periodi più ampi del mese, perchè uno stesso giorno non può appartenere a due mesi; la nostra tabellina ora è più “pulita”:

Ora la % del mese è un gioco da ragazzi: