Dax - condizione incrociata tra tabelle diverse

Il software per la BI di Microsoft, leader nel mercato

luigiscuderi
Messaggi: 8 | Topic creati
Iscritto il: lun 4 mar 2024, 9:10

Dax - condizione incrociata tra tabelle diverse

Messaggio da luigiscuderi »

Salve a tutti,
sto cercando di misurare la percentuale di vendite locali in un marketplace dove ci sono fornitori e clienti di tutte le regioni.
In sostanza la percentuale di vendite in cui la regione del fornitore e la regione del cliente sono la stessa.
La struttura dei dati, semplificata è:
Tabella dei fatti:
id transazione
importo transazione
id fornitore
id cliente

Tabella clienti:
id cliente
Nome cliente
Regione cliente

Tabella fornitori:
id fornitoe
Nome fornitore
Regione fornitore

C'è il collegamento tramite id cliente tra la tabella dei fatti e la tabella clienti ed altrettanto (tramite id fornitore) tra tabella dei fatti e tabella fornitori.
Ho provato ad usare CALCULATE ma non mi fa mettere Regione fornitore = regione cliente, quando metto regione fornitore = poi non mi fa vedere la tabella clienti ma solo quella fornitori.
Ho provato anche con if, stessa cosa...
Eppure se creo una tabella con regione fornitore nelle righe e regione cliente nelle colonne con i valori di vendita messi come percentuale del totale la cosa viene rappresentata...


Avatar utente

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

Dax - condizione incrociata tra tabelle diverse

Messaggio da Andrea90 »

luigiscuderi ha scritto: lun 4 mar 2024, 9:30 Eppure se creo una tabella con regione fornitore nelle righe e regione cliente nelle colonne con i valori di vendita messi come percentuale del totale la cosa viene rappresentata...
Ed è normale che sia così, altrimenti non sarebbero possibili nemmeno le analisi temporali perché se prendi un'analisi classica come fatturato per [prodotto] visto per [mese] sulle righe hai il campo prodotto che apparterrà alla lookup table dei prodotti, mentre sulle colonne avrai il mese che appartiene alla lookup table del calendario. Ma questi due campi sono utilizzati per "filtrare" i valori della tua tabella dei fatti, la quale è collegata a queste due tabelle tramite una relazione 1 a *.

Se invece provassi a prendere un campo dell'anagrafica prodotti, analizzato per un campo della tabella Calendario non troveresti, di default, nulla di logico. Questo perché nel modello dati la propagazione del filtro (e dunque la capacità di visualizzare report "sensati") è legata dalle frecce che collegano le varie tabelle. Il filtro segue il verso della freccia quindi nel tuo caso l'ID cliente riesce a filtrare la tabella dei fatti, ma li si ferma perché se volesse filtrare la tabella dei fornitori dovrebbe andare nel verso contrario della freccia che lega la tabella dei fornitori a quella dei fatti.

In questi contesti si può utilizzare CROSSFILTER dentro CALCULATE per modificare il senso della freccia per la sola misura che si sta utilizzando (best practice), oppure rendere il modello bi-direzionale (con buona probabilità di rendere il modello ambiguo - e dunque inutilizzabile - un domani), oppure modificare il modello. Ma tutte queste sono indicazioni generiche, se non vediamo un file demo ed un risultato desiderato non si riesce ad essere più specifici.

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

Autore del topic
luigiscuderi
Messaggi: 8 | Topic creati
Iscritto il: lun 4 mar 2024, 9:10

Dax - condizione incrociata tra tabelle diverse

Messaggio da luigiscuderi »

Grazie mille per la risposta
La mia misura dovrebbe essere:
Vendite locali = calculate(vendite,regionecliente=regionefornitore
Temo che non sia un problema di direzionalità, quando uso calculate e inizio a scrivere la condizione posso selezionare la colonna "Ragione PA", poi metto = e inizio a scrivere regione ma non mi compare più nell'elenco dei selezionabili la regione fornitore (allego due immagini
Ad ogni modo ho messo un pbix creato per far capire qui:

Immagine

Immagine
Avatar utente

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

Dax - condizione incrociata tra tabelle diverse

Messaggio da Andrea90 »

luigiscuderi ha scritto: lun 4 mar 2024, 11:51 Temo che non sia un problema di direzionalità
Ed invece ti dico di si.... altrimenti perché funzionerebbe mettendo dopo l'uguale campi che fanno riferimento alla tabella ordini o a quella da cui parti?

Prova a mettere invece come condizione ordini[Id cliente] = ... vedrai che non ti compariranno ne i campi della tabella clienti e nemmeno quelli della tabella fornitori.... essendo la tab ordini sul lato molti della relazione, con entrambe le tabelle clienti e fornitori.

Quello che tu scrivi come CALCULATE( [misura], tab1[campo1]="Pippo") in realtà si traduce come:

Codice: Seleziona tutto

CALCULATE( [misura], FILTER( ALL( tab1[campo1] ), tab1[campo1] = "Pippo") )
Questo non toglie che tu possa salvarti in una variabile (utilizzando VAR) il dato della regione del campo che metti sulle righe (togliendo il secondo campo dall'area colonne) e poi scrivendo quel CALCULATE andando a verificare che il campo della seconda tabella sia uguale a quello presente nella variabile calcolata al passaggio precedente.

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

Autore del topic
luigiscuderi
Messaggi: 8 | Topic creati
Iscritto il: lun 4 mar 2024, 9:10

Dax - condizione incrociata tra tabelle diverse

Messaggio da luigiscuderi »

Grazie della risposta. Purtroppo non riesco a capire come risolvere. Con la variabile come dovrei fare?
Avatar utente

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

Dax - condizione incrociata tra tabelle diverse

Messaggio da Andrea90 »

@luigiscuderi,

Se metti sulle righe il campo [Regione Fornitore] e ti viene fuori la riga "Abruzzo" tu vuoi eseguire il calcolo:

Codice: Seleziona tutto

CALCULATE( [Vendite], Clienti[Regione Cliente] = "Abruzzo")
Praticamente nella tua matrice che hai allegato tu vuoi ottenere i valori che giacciono sulla diagonale principale. Corretto?

Se è così allora l'utilizzo delle VAR conviene. In generale conviene sempre utilizzare le VAR, quanto meno per rendere il codice più leggibile e pulito.

L'utilizzo è il seguente (faccio un esempio generico):

Codice: Seleziona tutto

VAR nome_var_1 = ....
VAR nome_var_2 = ....
result = DIVIDE ( nome_var_1, nome_var_2)
RETURN result
Ogni volta che scrivi VAR lo fai seguire dal nome che a quella variabile vuoi assegnare, e dal codice DAX che deve valorizzare. Ad ogni step successivo puoi utilizzare le variabili calcolate precedentemente.

Nel tuo caso come primo passaggio dovrai calcolarti il valore della regione che hai sulla riga della tua matrice. Per farlo potresti utilizzare VALUES() la quale ti restituisce un valore scalare se il valore è unico (ad esempio se guardi la riga della regione Abruzzo), oppure una tabella se sei su una riga che per il campo [Regione] contiene più di un valore (ad esempio sulla riga di totale).

Come result dovrai andare ad eseguire il tuo CALCULATE, ma ricordandoti che nelle righe di totale non potrai utilizzare [Regione] = ... perché "=" vale solo quando il valore da controllare è univoco.

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

Autore del topic
luigiscuderi
Messaggi: 8 | Topic creati
Iscritto il: lun 4 mar 2024, 9:10

Dax - condizione incrociata tra tabelle diverse

Messaggio da luigiscuderi »

Grazie mille per il tempo che hai dedicato.
Quello che vorrei è un indicatore che io possa usare per i fornitori, quindi indipendentemente dalla tabella. La percentuale vendite dalla propria regione vorrei che fosse utilizzabile come misura per valutarne le variazioni (es: quanti fornitori dipendono per più del 50% clienti della propria regione? o anche: per il fornitore x come varia negli anni il peso dei clienti della propria regione?)
Mi serve quindi una misura da usare in varie occasioni e filtrabile come è filtrabile la tabella dei fatti (che è più articolata di quella in esempio...
Con le variabili non riesco ancora a capire come fare
Dovrei trovare il modo di valorizzare la variabile 1 con la regione del fornitore della transazione x e la variabile 2 con la regione del cliente della transazione x, e poi fare un calculate con la condizione che la var1 è uguale alla var 2...
La funzione lookupvalue potrebbe aiutare?
Avatar utente

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

Dax - condizione incrociata tra tabelle diverse

Messaggio da Andrea90 »

@luigiscuderi,

Prendi ad esempio la regione Abruzzo e scrivi quale valore numerico dovrebbe riportare la misura per quella regione, evidenziando i calcoli che sei andato ad eseguire.

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

Autore del topic
luigiscuderi
Messaggi: 8 | Topic creati
Iscritto il: lun 4 mar 2024, 9:10

Dax - condizione incrociata tra tabelle diverse

Messaggio da luigiscuderi »

Non riesco a capire come mettere in una variabile la regione del fornitore e in un'altra variabile la regione del cliente, il tutto dovrebbe essere riferito alla singola transazione, che ha in chiave sia il fornitore che il cliente... non so proprio come uscirne
Avatar utente

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

Dax - condizione incrociata tra tabelle diverse

Messaggio da Andrea90 »

Andrea90 ha scritto: lun 4 mar 2024, 14:56 Prendi ad esempio la regione Abruzzo e scrivi quale valore numerico dovrebbe riportare la misura per quella regione, evidenziando i calcoli che sei andato ad eseguire.
E tu scrivi:
luigiscuderi ha scritto: mer 27 mar 2024, 17:00 Non riesco a capire come mettere in una variabile la regione del fornitore e in un'altra variabile la regione del cliente, il tutto dovrebbe essere riferito alla singola transazione, che ha in chiave sia il fornitore che il cliente... non so proprio come uscirne
Quindi torno a scrivere, Prendi ad esempio la regione Abruzzo e scrivi quale valore numerico dovrebbe riportare la misura per quella regione, evidenziando i calcoli che sei andato ad eseguire (vuol dire prendere un file excel e scrivere i numeri a mano così come il risultato desiderato, altrimenti non si va avanti).

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
Rispondi