Misura DAX per calcolo ritardatari

Il software per la BI di Microsoft, leader nel mercato
Rispondi
Avatar utente

Godwyn
Messaggi: 17 | Topic creati
Iscritto il: sab 5 dic 2020, 11:07
Luogo: Varese
Ringraziato: 4 volte

Misura DAX per calcolo ritardatari

Messaggio da Godwyn »

Ciao a tutti,

sto impazzendo su una misura DAX che non vuole quadrare. La faccenda è relativamente semplice, sicuramente sbaglio qualcosa di banale...

1) Ho una lista di clienti nella tabella Dim_Clienti. Gli attributi di questa tabella sono il Cod_Cliente e la RS_Cliente.
2) Ho una tabella dei fatti Fact_Sales dove ho le date fattura (Fact_Sales[DataFattura]).

Avevo necessità di due cose:

a) Creare una misura che mi indicasse per ogni Cod_Cliente i mesi trascorsi dall'ultima data fattura. E ci sono riuscito con:

Codice: Seleziona tutto

MesiDaUltimaFattura = 
    VAR DifferenzaMesi =
        DATEDIFF([DataUltimaFattura],MAXX(ALL (Fact_Sales), Fact_Sales[DataFattura]),MONTH)
    RETURN
        IF(AND(DifferenzaMesi<1,ISTEXT([MeseUltimaFatturaName])),"Cliente Conforme",DifferenzaMesi)
Insomma ho calcolato una variabile DifferenzaMesi e poi ho creato una regola che quando questa VAR è > 1 mese e il campo nome mese era presente mi dicesse che il cliente era conforme, altrimenti mi scrivesse la VAR.

Vorrei replicare la questione sopra in ottica KPI, indicando la numerica dei clienti che hanno i mesi dall'ultima fattura > 0 (insomma, sono in ritardo) e li contasse, solo per l'anno 2021.

Mi sono arenato. :)

Mi aiutate ragazzi? Grazie mille as usual.


Avatar utente

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

Misura DAX per calcolo ritardatari

Messaggio da Andrea90 »

Ciao Godwyn,

Perché invece di usare una misura non ti sei creato una colonna calcolata nella tabella dell’anagrafica dei tuoi clienti?

Così sarebbe tutto molto più semplice per calcolare il numero di coloro che sono in ritardo.

Per quanto riguarda la formula da usare, se vuoi rimanere dal lato delle misure, per quel che mi riguarda ti converrebbe allegare un file demo, poiché per fare delle prove serve avere qualcosa sotto su cui poter lavorare.

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
Avatar utente

Autore del topic
Godwyn
Messaggi: 17 | Topic creati
Iscritto il: sab 5 dic 2020, 11:07
Luogo: Varese
Ringraziato: 4 volte

Misura DAX per calcolo ritardatari

Messaggio da Godwyn »

Ciao Andrea90!

Hai ragione, potevo banalmente usare una colonna calcolata, ma stavo provando a giocare un po' con alcune misure e volevo riuscirci, sono testardo! :lol:

Fore però ce l'ho fatta:

Codice: Seleziona tutto

ConteggioRitardatari = 
CALCULATE(
	COUNTA(Dim_Cliente[CodCliente]),
		FILTER(ALL(Dim_Cliente[CodCliente]),
			DATEDIFF([DataUltimaFattura],MAXX(ALL (Fact_Sales), Fact_Sales[DataFattura]),MONTH)>0))
Gli chiedo insomma di contare i codici cliente filtrando dove la datediff tra l'ultima data fattura di vendita e il max del numero mese nella fact_sales è >0. Scusami se non sono riuscito ad inviarti una demo, ma ci mettevo un po' a creare il tutto e forse ci sono arrivato prima! :)
Avatar utente

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

Misura DAX per calcolo ritardatari

Messaggio da Andrea90 »

Ciao Godwyn,

Non vedendo il file, ed il modello dati, faccio fatica a dire se può andar bene oppure no, ma c'è sicuramente una cosa che approfondirei:

Codice: Seleziona tutto

MAXX(ALL (Fact_Sales), Fact_Sales[DataFattura])
Con questa formula tu vorresti calcolare che cosa? La data più recente all'interno della tua Fact Table?

Perché inserendola dentro ad un FILTER() che è una formula iterativa, e pertanto ti valuta la condizione richiesta per ciascuna riga del campo CodCliente, tu stai andando ad utilizzare MAXX() che è un altro iteratore, questo vuol dire che se hai 10 clienti, con una fact table da 10.000 righe, tu effettuerai 100.000 iterazioni. Con un consumo esagerato di risorse.

Perché non calcolare quel valore una sola volta utilizzando una VAR ad esempio?

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
Avatar utente

Autore del topic
Godwyn
Messaggi: 17 | Topic creati
Iscritto il: sab 5 dic 2020, 11:07
Luogo: Varese
Ringraziato: 4 volte

Misura DAX per calcolo ritardatari

Messaggio da Godwyn »

Sono in difficoltà a creare una VAR che funzioni, perchè mi mancano dei pezzi Andrea... Tipo, se capisco bene:

Codice: Seleziona tutto

ConteggioRitardatari = 
    VAR Ritardatario =
      DATEDIFF(MAXX(ALL(Fact_Sales),
            Fact_Sales[DataFattura]),
                [DataUltimaFattura],MONTH
        )
    RETURN
        CALCULATE(COUNTA(Dim_Clienti[CodClienti]),Ritardatario > 0)
La VAR restituisce un valore scalare in teoria, che è rappresentato dal numero dei mesi che intercorrono dalla data dell'ultima fattura alla data più recente che si trova nella tabella Fact_Sales.

Sulla seconda parte vado in difficoltà perchè vorrei una tabella con:

Colonna 1: Codice Cliente
Colonna 2: Mesi trascorsi dall'ultima data fattura (la VAR creata sopra)

Sulla seconda colonna voglio effettuare un conteggio distinto per codice cliente.

Provo a prepararti una piccola demo in giornata! :)
Avatar utente

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

Misura DAX per calcolo ritardatari

Messaggio da Andrea90 »

Ciao Godwyn,

Con la VAR io intendevo di scrivere al suo interno la formula che ti avevo evidenziato, e di sostituirla dentro a Conteggio Ritardatari, quando calcoli il DATEDIFF(). In questo modo la data più recente nella tabella Sales viene calcolata una sola volta.

Poi dal tuo ultimo messaggio sembra che tu voglia creare delle colonne calcolate (mentre all’inizio parlavi di misure), quindi forse sto facendo un pò di confusione. Se riesci a preparare una demo con il risultato desiderato indicato a mano ok, altrimenti fa lo stesso.

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
Avatar utente

Autore del topic
Godwyn
Messaggi: 17 | Topic creati
Iscritto il: sab 5 dic 2020, 11:07
Luogo: Varese
Ringraziato: 4 volte

Misura DAX per calcolo ritardatari

Messaggio da Godwyn »

No, scusami, sono io che io che ho usato termini errati, la tabella è fuori luogo, era una mera rappresentazione che di ciò che mi aspetto faccia la formula, ma a tutti gli effetti è errato, perchè DAX funziona in altri modi.

Provo a rispiegarmi meglio, perdonami :)

Ho una tabella dei clienti. Una tabella fatti delle fatture di questi clienti. I miei clienti inviano "manualmente" ogni mese le fatture alla mia azienda.

Vorrei creare un KPI che mi indichi quanti clienti distinti sono in ritardo nell'invio delle fatture.

Non riesco a capire cosa non funzioni nella formula:

Codice: Seleziona tutto

ConteggioRitardatari = 
    VAR Ritardatario =
      DATEDIFF(MAXX(ALL(Fact_Sales),
            Fact_Sales[DataFattura]),
                [DataUltimaFattura],MONTH
        )
    RETURN
        CALCULATE(COUNTA(Dim_Clienti[CodClienti]),Ritardatario > 0)
Mi segnala che l'espressione true/false non specifica una colonna specifica. :(

Edit: ma soprattutto non ho capito perchè questa invece funziona, seguendo il tuo esempio e creando la VAR

Codice: Seleziona tutto

ConteggioRitardatari = 
VAR LastFattura = 
        MAXX(ALL (Fact_Sales), Fact_Sales[DataFattura])
RETURN
        CALCULATE(
            COUNTA(Dim_Clienti[CodClienti]),
                FILTER(ALL(Dim_Clienti[CodClienti]),
                DATEDIFF([DataUltimaFattura],LastFattura,MONTH) > 0)
        )
Avatar utente

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

Misura DAX per calcolo ritardatari

Messaggio da Andrea90 »

Ciao Godwyn,

Un filter argument di CALCULATE non funziona su di una espressione, quel Ritardatario > 0 non fa riferimento ad un campo di una tabella presente nel data model. Se vuoi utilizzare una simile espressione devi impostare l’argomento filtro tramite FILTER().

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