Continuiamo la nostra serie di tutorial dedicati al linguaggio DAX, ed in modo particolare al contesto riga, che ricordiamo essere uno dei pilastri fondamentali per la creazione di misure o colonne calcolate all'interno dei nostri applicativi sviluppati in Excel tramite le PowerPivot o direttamente in Power Bi.
Mentre nelle precedenti sezioni ci siamo focalizzati sugli aspetti teorici, quest'oggi andremo sul pratico e proveremo ad applicare qualche formula iterativa al nostro piccolo modello realizzato in PowerPivot.
Il modello si compone delle seguenti fonti dati:
Una volta caricate le tre tabelle con PowerQuery possiamo poi crearci il nostro modello dati, creando le dovute relazioni:
Ora molto banalmente possiamo creare una misura che calcoli il totale delle vendite. La formula potrebbe essere, molto banalmente, la seguente:
Codice: Seleziona tutto
=SUM(Record[Fatturato])
La formula ha funzionato, ed il risultato ottenuto è corretto, ma in realtà la sintassi che abbiamo inserito dentro la definizione della misura TotSales non è quella che poi il sistema utilizza veramente.
Infatti, la formula realmente utilizzata è la seguente:
Codice: Seleziona tutto
= SUMX(Record;Record[Fatturato])
Ma allora possiamo provare a complicare un po' le cose. Visto che la formula itera una tabella, perché non creiamo una seconda formula che ci riporti una tabella filtrata (per una data condizione), al fine di ottenere la somma delle vendite per il solo prodotto "Prodotto_002"?
Ma quale può essere una formula in grado di fornirci come output una tabella filtrata?
La risposta a questa domanda è presente nel tutorial precedente e cioè la funzione FILTER().
Ricordiamo brevemente che FILTER() è una funzione iterativa che verifica una data condizione, riga per riga, all'interno di una tabella, riportando solamente le righe che soddisfano tale condizione.
La formula potrebbe dunque essere:
Codice: Seleziona tutto
FILTER ( Record; Record[Prodotto] = "Prodotto_002" )
Codice: Seleziona tutto
=SUMX ( FILTER ( Record; Record[Prodotto] = "Prodotto_002" ); Record[Fatturato] )
Per rendere le cose più chiare possiamo guardare l'output che si ottiene con la formula FILTER():
Ora si possono vedere quali sono le righe che verranno effettivamente computate con SUMX(), ricordandosi che la dimensione di riferimento sarà poi la [Regione].
E se volessimo filtrare la tabella dei Record per la sola categoria "Occhiali"?
Il dato della categoria non è presente all'interno della tabella Record, ma risulta esserlo nella tabella collegata, relativa all'anagrafica dei prodotti.
Ma se ben ricordate dai tutorial precedenti non è possibile scrivere una formula come la seguente:
Codice: Seleziona tutto
FILTER ( Record; Prodotti[Categoria] = "Occhiali" )
Codice: Seleziona tutto
FILTER ( Record; RELATED ( Prodotti[Categoria] ) = "Occhiali" )
Ed infatti solo il "Prodotto_002" ed il "Prodotto_004" appartengono alla categoria "Occhiali".
Scriviamo la nuova misura e la inseriamo nella PowerPivot:
Codice: Seleziona tutto
=SUMX(FILTER ( Record; RELATED ( Prodotti[Categoria] ) = "Occhiali" );Record[Fatturato])
E se volessimo aggiungere un'altra condizione basata sull'età degli agenti?
Ormai abbiamo capito la logica da utilizzare, l'unica cosa è comprendere come verificare due o più condizioni contemporaneamente all'interno della formula FILTER(). La modalità per farlo è spiegata nel precedente tutorial. Visto che le condizioni da verificare sono solamente due possiamo utilizzare la formula AND().
Codice: Seleziona tutto
FILTER (
Record;
AND (
RELATED ( Prodotti[Categoria] ) = "Occhiali";
RELATED ( Agente[Età] ) >= 30
)
)
E come vediamo la differenza rispetto alla tabella precedentemente filtrata è che le vendite dell'agente "Paolo" non sono più visibili poiché la sua età non è sufficiente per la condizione che abbiamo impostato.
Creiamo dunque la nostra nuova misura:
Codice: Seleziona tutto
=SUMX (
FILTER (
Record;
AND (
RELATED ( Prodotti[Categoria] ) = "Occhiali";
RELATED ( Agente[Età] ) >= 30
)
);
Record[Fatturato]
)
Con quest'ultimo esempio terminiamo il tutorial del giorno ricordando che lo scopo era quello di riuscire a mostrare qualche esempio pratico di calcolo utilizzando formule iterative, anche in combinazione tra loro.
Ovviamente, come quasi sempre accade in questi ambiti, esistono diverse metodologie per raggiungere gli stessi risultati, anche con livelli di performance superiori.
Quello che però volevamo ottenere era di riuscire a fornire le basi delle logiche di calcolo del linguaggio DAX al fine di costruire in futuro formule sempre più complesse e performanti.
Come sempre per eventuali commenti, suggerimenti, o integrazioni al tutorial è possibile scrivere un messaggio all'interno della sezione "Feedback" --> Qui
Colgo l'occasione per ringraziare tutti coloro che hanno deciso di dedicare parte del loro tempo alla lettura di questo tutorial.
A presto,
Andrea