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: