[Power BI] Row Context - Pt.4

Bloccato
Avatar utente

Andrea90
Messaggi: 2187 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 665 volte
Contatta:

[Power BI] Row Context - Pt.4

Messaggio da Andrea90 »

Buongiorno a tutti :wave:,

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:

Immagine

Una volta caricate le tre tabelle con PowerQuery possiamo poi crearci il nostro modello dati, creando le dovute relazioni:

Immagine

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])
Se prendiamo come dimensione il campo Regione, ed inseriamo il tutto all'interno di una PPivot avremo:

Immagine

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])
Come abbiamo visto nei precedenti tutorial, SUMX() è una formula iterativa, e cioè itera una tabella, in questo caso la tabella Record, andando ad eseguire una data espressione, riga per riga, al termine del quale aggregherà il tutto al fine di ottenere un valore scalare.

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" )
Creiamo la nuova misura che vada si ha sommare i dati presenti in una tabella, ma la tabella in questione dovrà essere diversa da quella di partenza, perché verrà filtrata per una specifica condizione:

Codice: Seleziona tutto

=SUMX ( FILTER ( Record; Record[Prodotto] = "Prodotto_002" ); Record[Fatturato] )
Inserendo come primo argomento di SUMX() la nostra tabella filtrata, ed inserendo il tutto sulla PowerPivot avremo:

Immagine

Per rendere le cose più chiare possiamo guardare l'output che si ottiene con la formula FILTER():

Immagine

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" )
per farlo correttamente bisogna utilizzare la formula RELATED() in grado di associare ad ogni riga della tabella Record, il corrispettivo valore della tabella Prodotti.

Codice: Seleziona tutto

FILTER ( Record; RELATED ( Prodotti[Categoria] ) = "Occhiali" )
Questa formula riporta come output la tabella che segue:

Immagine

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])
Ed il risultato ottenuto sarà:

Immagine

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
    )
)
La tabella risultante sarà:

Immagine

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 la seguente PowerPivot risultante:

Immagine


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



Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Bloccato