Come usare il linguaggio DAX su Power BI

linguaggio DAX su Power BI

DAX (diminutivo di “Data Analytics Expression”) è il linguaggio che può essere utilizzato all’interno di Power Query per creare misure, colonne calcolate ed in alcuni casi persino tabelle. Non va confuso con le formule M, presenti all’interno di Power Query come estensione delle già numerose possibilità di trasformazioni dei dati tramite l’interfaccia. L’utilizzo del DAX avviene infatti in un momento successivo rispetto a Power Query, ossia soltanto dopo avere importato i dati, per intenderci quindi dopo avere cliccato su “Close and Apply”.

Le funzioni DAX

Il linguaggio DAX dispone di tantissime funzioni anche se in fin dei conti la gran parte del lavoro viene tipicamente fatto adoperandone non più di una ventina. La lista completa delle funzioni può essere trovata al seguente link https://learn.microsoft.com/en-us/dax/dax-function-reference

Osserviamo subito che alcune funzioni possono essere utilizzate soltanto con specifici tipi di dato, per esempio le funzioni di time-intelligence funzionano con colonne di tipo data, mentre le operazioni matematiche con colonne numeriche o di tipo “Currency”. Invece quando esprimiamo un valore in una formula DAX dobbiamo utilizzare i doppi apici se ci stiamo riferendo ad un testo, lo vedrete anche negli esempi in seguito.

Le funzioni possono essere categorizzate in una serie di famiglie. Queste ad esempio possono essere utilizzate per effettuare operazioni matematiche o logiche sui dati, per filtrarli e tanto altro. Le operazioni matematiche di base, possono essere effettuate utilizzando i simboli matematici, (+ , , * , / , ^), inoltre la divisione può essere effettuata utilizzando la funzione “DIVIDE”, con la quale possiamo specificare anche un valore particolare da restituire quando la divisione è impossibile (quindi nel caso di divisione per 0 o di divisione per valore nullo).

Tutte le altre operazioni matematiche possono essere effettuate adoperando funzioni opportune, per esempio “SIN” e “COS” per calcolare seno e coseno di un angolo, “LOG” ed “LNper effettuare il logaritmo su una base specificata o in base e, “ROUNDUP” e “ROUNDDOWN” per approssimare i numeri.

Abbiamo poi una serie di funzioni di aggregazione, utilizzabili appunto per aggregare i dati contenuti in più righe. Per esempio possiamo fare la somma di una serie di numeri utilizzando la “SUM”, possiamo calcolare il valore minimo o massimo con la “MIN” e con la “MAX”, possiamo effettuare una media utilizzando la “AVG”, possiamo contare tutte le righe di una tabella con la “COUNTROWS” o possiamo contare il numero di elementi distinti in una colonna utilizzando la “DISTINCTCOUNT” o la “DISTINCTCOUNTNOBLANK” per escludere dal conteggio un eventuale valore blank (quindi nullo).

Funzioni DAX di tipo X

Parliamo ora delle funzioni SUMX, AVGX, MAXX e MINX. Queste funzioni sono equivalenti nel loro funzionamento alle stesse funzioni senza la “X” finale, ma mentre ad esempio la SUM viene effettuata su una colonna di una tabella, la SUMX somma tutti i valori di una espressione calcolata per ogni riga della tabella stessa. Per fare un esempio, mettiamo che io abbia una colonna con il prezzo di un prodotto e una colonna con la quantità di prodotto venduto come quella in figura:

Tabella su Power BI per mostrare la differenza di utilizzo tra SUM e SUMX

Se voglio calcolare la spesa totale dovrei moltiplicare riga per riga prezzo e quantità e poi sommare tutti gli importi, con la “SUM” potrei calcolare solo la quantità totale, mentre con la SUMX posso effettuare la moltiplicazione riga per riga e poi sommare tutto. In questo caso scriveremo:

spesa totale = SUMX(Spesa,Spesa[prezzo]*Spesa[quantità])

Creare una colonna DAX di base

Per creare una nuova colonna DAX per prima cosa dobbiamo andare sulla “Data view”, cioè la pagina di Power BI Desktop dalla quale possiamo visualizzare le nostre tabelle. Per arrivarci basta cliccare sul logo a forma di tabella sul lato sinistro dello schermo. A questo punto selezioniamo la tabella di nostro interesse e poi clicchiamo su “New Column”. A questo punto potremo scrivere il codice DAX!

Ammettiamo ad esempio di voler effettuare la sottrazione tra due colonne, la colonna “Gross Sales” e la colonna “Discount” ottenendo così una colonna che voglio chiamare “Discounted Sales”. Mi basterà scrivere appunto la formula di sottrazione (Figura 2).

Esempio di utilizzo del linguaggio DAX per eseguire una sottrazione tra colonne in Power BI

Potete inoltre notare che mentre scriviamo la nostra formula Power BI ci fornisce dei suggerimenti, volendo possiamo autocompletare la nostra formula con il primo suggerimento premendo il tasto tab.

corso di analisi dei dati
Se vuoi diventare un esperto (qualunque sia il tuo livello di partenza) ti invito a visitare l’anteprima gratuita della piattaforma –> La Scuola dei Dati <–

Creare una colonna DAX avanzata

Facciamo un esempio più complesso per cui su ogni riga vogliamo riportare l’ammontare percentuale delle Gross Sales della riga rispetto al totale delle Gross Sales della tabella. La metrica in oggetto può essere scritta come segue:

Gross Sales Percentage = DIVIDE('2013'[Gross Sales],
                                                      CALCULATE(SUM('2013'[Gross Sales]),
                                                                          ALL('2013')
                                                                           )
                                                      )

Vediamo passo passo come è composta. Abbiamo utilizzato una serie di funzioni, in primis la DIVIDE che serve ovviamente ad effettuare una divisione tra due termini; la “DIVIDE” vuole quindi almeno due argomenti ossia un numeratore ed un denominatore, che saranno separati da una virgola. A numeratore ho le Gross sales della singola riga: l’espressione ‘2013’[Gross Sales] è composta dal “2013” che è il nome della nostra tabella (che serve per evitare ambiguità nel caso in cui esistano più colonne con lo stesso nome su tabelle diverse), mentre il nome delle colonna è sempre indicato tra parentesi quadre.

Il denominatore è più complicato:

CALCULATE(SUM('2013'[Gross Sales]),ALL('2013'))

In questo caso dobbiamo per prima cosa utilizzare la funzione CALCULATE, questa funzione è necessaria ogni qual volta vogliamo cambiare il contesto di filtro dei nostri dati, necessario poiché vogliamo eseguire un calcolo che coinvolga tutte le righe. La CALCULATE richiede anch’essa almeno due argomenti, cioè l’espressione da calcolare seguita dal contesto di filtro da applicare.

L’espressione che vogliamo in questo caso valutare a denominatore è la somma delle Gross Sales, quindi scriveremo SUM(‘2013′[Gross Sales]). A numeratore invece non c’è stato bisogno della funzione “SUM” perché il numeratore è semplicemente il valore delle gross sales presente nella specifica riga. Infine dobbiamo inserire il contesto di filtro, in questo caso voglio che il denominatore comprenda le gross sales di tutta la tabella, quindi utilizzo la funzione “ALL” seguita dalla tabella come argomento.

La funzione ”ALL” può avere come argomento una tabella o una o più colonne e ci permette di eliminare qualsiasi filtro implicito o esplicito effettuato sulla tabella o la/le colonne selezionate. Nel nostro esempio quindi fa sì che il denominatore sia calcolato come somma delle Gross Sales dell’intera tabella. Se omettessimo la ALL la nostra colonna calcolata fornirebbe come risultato sempre e soltanto 1, ossia la divisione delle Gross Sales della riga per se stesse.

Creare una tabella con il linguaggio DAX

Il linguaggio DAX può anche essere utilizzato per creare delle intere tabelle. Per creare una tabella DAX basta cliccare su “Nuova taballa” all’interno della barra degli strumenti in alto. Ovviamente per creare una tabella DAX dovremo utilizzare delle funzioni specifiche, funzioni che come risultato danno appunto una tabella. Un classico esempio di tabella che può essere creata direttamente in DAX è il calendario, che in quasi tutti i modelli dati è necessario per filtrare campi di tipo “data”. Per questo scopo si possono utilizzare la funzione “CALENDAR” e la funzione “CALENDARAUTO”.

La “CALENDARAUTO” può essere utilizzata senza argomento scrivendo soltanto

Calendar = CALENDARAUTO()

Power BI in questo caso crea automaticamente una tabella costituita da un’unica colonna contenente le date presenti nelle altre tabelle del modello.

La funzione CALENDAR permette invece di specificare la data iniziale del calendario e quella finale, per esempio con la seguente formula creeremo un calendario che va dal primo Gennaio 2022 al 31 Dicembre 2023:

 Calendar = CALENDAR(DATE(2022,01,01),DATE(2023,12,31))

Altre funzioni che possiamo utilizzare per creare delle tabelle sono ad esempio la “UNION” che può essere sfruttata per unire più tabelle e la “INTERSECT” che accetta due argomenti e restituisce tutte le righe in comune tra le due.

Se vogliamo aggiungere una tabella con dei dati inputati manualmente possiamo farlo seguendo la seguente sintassi:

Tabella di esempio = {(1,2,3),(4,5,6)}

In questo caso Power BI genererà una tabella costituita da due righe e due colonne, ogni riga è rappresentata da una parentesi tonda aperta e chiusa.

Esempio di tabella creata direttamente con il DAX di Power BI

Creare una misura DAX

L’utilizzo principale del linguaggio DAX è la produzione di misure. Una misura, diversamente da una colonna, è una grandezza aggregata che non deve quindi essere necessariamente calcolata in un contesto di singola riga. Per fare un primo esempio molto semplice, in relazione al modello già visto potremmo creare una misura per calcolare le Gross Sales della tabella 2013 come segue:

Gross Sales 2013 = SUM('2013'[Gross Sales])

Utilizzando la funzione “SUM” otteniamo un unico valore che aggrega tutte le righe della tabella. Questa misura potrà poi essere interrogata secondo le nostre dimensioni di analisi, per esempio potremo utilizzarla per guardare le gross sales per country:

Esempio di grafico che utilizza una misura DAX in Power BI

Spesso può essere utile utilizzare alcune funzioni di filtro (come la già citata ALL) per creare delle misure più specifiche. Per esempio possiamo decidere di filtrare la misura di gross sales, come nella seguente metrica dove calcoliamo la stessa somma di prima ma filtriamo per il solo prodotto “Amarilla”.

Gross Sales 2013 Amarilla = CALCULATE(SUM('2013'[Gross Sales]),FILTER('2013','2013'[Product]="Amarilla"))

Di seguito un grafico che presenta sia la misura precedente (quella “a totale”) e sia quella filtrata per il prodotto Amarilla.

Esempio di grafico con una misura DAX più complessa.

Continua a imparare

Torna in alto
Torna su