Riporto il mio problema sperando che sia di aiuto anche a chi come me sta avendo un po' di difficoltà ad apprendere i vari comportamenti delle formule dax rispetto ai contesti in cui vengono utilizzate. Io personalmente, per "capire" ho bisogno di immaginare i vari step che influenzano i risultati delle mie formule.
Perdonate il post molto lungo, ma un altro modo per imparare è provare a spiegare come si ottengono dei risultati e quindi annoterò anche i passaggi eseguiti prima di esporre il dubbio.
Nel file di esempio abbiamo relazionate 3 tabelle:
Sales -> in cui sono contenuti i dettagli degli ordini, cosiddetta "data table"
ADV_Products_LUT -> tabella contenente i dettagli dei prodotti, cosiddetta "look up table"
ProvinceItaliane_LUT -> tabella contenente i dettagli relativi alle province italiane, cosiddetta "look up table"
L'esercizio da svolgere è il seguente:
Trovare l'incidenza percentuale delle fatturato delle vendite per quei prodotti il cui prezzo e maggiore della media dei prezzi di tutti i prodotti, suddiviso per provincia.
Dobbiamo quindi trovare:
1- La somma del fatturato di tutti i prodotti venduti
2- La media dei prezzi di tutti i prodotti.
2- La somma del fatturato dei soli prodotti venduti il cui prezzo è > della media dei prezzi di ogni prodotto
ed infine dividere i due risultati tra loro in modo da trovare l'incidenza percentuale %.
Vado quindi ad instanziare una matrice dove inserisco come ROWS il dato Città e come primo campo VALUES la seguente measure:
Codice: Seleziona tutto
SALES_AMOUNT = SUMX(Sales,Sales[Quantità_Ordinata]*RELATED(ADV_Products_LUT[Prodotto_Prezzo]))
Abbiamo innanzitutto un FILTER CONTEXT che è uguale a alle nostre Città:
Step 1 - La tabella di partenza
Step 2 - La tabella viene filtrata per ogni città, nell' esempio "Cagliari" (filter context)
Step 3 - Tramite la funzione RELATED viene relazionato il prezzo al prodotto
Step 4 - Viene applicata l' espressione contenuta nella funzione SUMX
Step 5 - Infine viene applicata la somma sui valori risultanti dall' espressione
Come vediamo, il risultato è lo stesso di quello calcolato all'interno della matrice di POWER BI, ovviamente vengono calcolate anche le somme per tutte le altre città.
Fin qui abbastanza semplice, abbiamo trovato la somma di tutti i prodotti venduti suddivisi per provincia.
Passiamo ora a calcolare la media dei prezzi di prodotti, anche questo è abbastanza facile:
Codice: Seleziona tutto
AVERAGE_PRODUCT_PRICE = average(ADV_Products_LUT[Prodotto_Prezzo])
Il risultato è 714.44. Se proviamo a mettere questa measure tra le VALUES della matrice, noteremo che ci verrà restituito sempre lo stesso risultato, contrariamente a quanto magari qualcuno potrebbe pensare (non vi è alcuna relazione diretta tra la tabella prodotti e la tabella città, non otterrò quindi il prezzo medio dei prodotti venduti a "Cagliari").
Detto ciò, abbiamo il totale venduto per provincia ed il prezzo medio. Andiamo a recuperare il totale venduto di quei prodotti il cui prezzo è maggiore del prezzo medio di tutti i prodotti.
Quello che vogliamo è pertanto:
1- Per ogni provincia
2- Sommare il prodotto tra le quantità vendute x il prezzo unitario
3- Solo per quei prodotti
4- Maggiori di 714.44.
Quindi la nostra formula ipotetica sarebbe qualcosa del tipo sum(quantità*prezzo) where prezzo > prezzo_medio
Tradotto in DAX:
Codice: Seleziona tutto
CALCULATE(SUMX(Sales,Sales[Quantità_Ordinata]*RELATED(ADV_Products_LUT[Prodotto_Prezzo])),ADV_Products_LUT[Prodotto_Prezzo]>average(ADV_Products_LUT[Prodotto_Prezzo]))
Codice: Seleziona tutto
CALCULATE([SALES_AMOUNT],ADV_Products_LUT[Prodotto_Prezzo]>[AVERAGE_PRODUCT_PRICE])
Non è possibile utilizzare una measure nell' argomento filtro della funzione CALCULATE, quindi l' espressione dax sopra indicata andrà in errore.
Per poter utilizzare la measure nell' argomento filtro dobbiamo utilizzare la funzione FILTER (che viene utilizzata da POWER BI dietro le quinte normalmente per le normali espressione che non la utilizzano).
DOVE NON CAPISCO COSA SUCCEDE
Quindi procediamo:
Codice: Seleziona tutto
CALCULATE([SALES_AMOUNT],FILTER(ADV_Products_LUT,ADV_Products_LUT[Prodotto_Prezzo]>[AVERAGE_PRODUCT_PRICE]))
Conosco già le soluzioni al problema ne ho ben due:
1- Costruire la measure AVERAGE_PRODUCT_PRICE nel seguente modo:
Codice: Seleziona tutto
CALCULATE(AVERAGE(ADV_Products_LUT[Prodotto_Prezzo]),all(ADV_Products_LUT))
2- Utilizzando una variabile, la quale non ho ancora studiato ma sembra decontestualizzi o comunque "fissi" il valore di un espressione:
Codice: Seleziona tutto
VAR _AvgPrice = DAX.Average_Products_Price
RETURN
CALCULATE (
[DAX.Sales_Amount],
FILTER ( ADV_Prodotti_LUT, ADV_Prodotti_LUT[Prodotto_Prezzo] > _AvgPrice )
)
1- La mia tabella viene prima filtrata per il filter context, sempre per ogni città, successivamente ad ogni riga viene applicata l' espressione di filtraggio
2- La tabella viene filtrata ulteriormente solo per i valori cui risultato dell' espressione di filtraggio è TRUE
3- Viene quindi applicata l' espressione per ogni riga, ed infine eseguita la somma (sumx), restituendo correttamente quanto ricercato
Mi è stato detto che la mia formula che ritorna l' AVERAGE non ritorna più 714.44 bensì lo stesso prezzo del prodotto per ogni riga prodotto e quindi la condizione di filtraggio non è mai soddisfatta e non viene ritornato niente. Ok ha senso, non faccio fatica a capire questo, ne che la mia average venga eseguita riga per riga, quello che non capisco è perché non faccia più la media su tutte le righe dei prodotti ma solo su quella che si sta iterando (sempre ammesso che sia questo ciò che avviene) ... Io eseguo l' average per ogni riga e per me questo significa essere in un row context, ma poi non mi immagino che anche la mia measure effettui calcoli solo utilizzando come source quell' unica riga...
Vi sarò molto grato se riuscite a spiegarmi ciò, forse penso di aver capito cosa sia il row context quando non è così ....