Calcoli aggiuntivi della funzionalità di Business Intelligence per le gerarchie temporali
Esistono altre funzionalità di Business Intelligence per le gerarchie temporali DAX che interessano la restituzione di una singola data. Le informazioni su queste funzioni verranno illustrate tramite l'applicazione in due scenari diversi.
Le funzioni DAX FIRSTDATE
e LASTDATE
restituiscono la prima e l'ultima data nel contesto di filtro corrente per la colonna di date specificata.
Calcolare le nuove occorrenze
Un altro uso delle funzionalità di Business Intelligence per le gerarchie temporali consiste nel contare le nuove occorrenze. L'esempio seguente mostra come è possibile calcolare il numero di nuovi clienti per un periodo di tempo. Il nuovo cliente viene conteggiato nel periodo di tempo in cui effettua il suo primo acquisto.
La prima attività è quella di aggiungere alla tabella Sales la misura seguente, che conta il numero di diversi clienti da inizio vita (LTD). Da inizio vita significa dall'inizio del periodo di tempo fino all'ultima data nel contesto di filtro. Formattare la misura come numero intero usando il separatore delle migliaia.
Customers LTD =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD
Aggiungere la misura Customers LTD (Clienti LTD) all'oggetto visivo matrice. Si noti che produce un risultato di clienti LTD diversi fino alla fine di ogni mese.
La funzione DATESBETWEEN
restituisce una tabella in cui è contenuta una colonna di date che inizia con una determinata data e continua fino a una determinata data di fine. Quando la data di inizio è vuota, userà la prima data nella colonna data. Al contrario, quando la data di fine è vuota, userà l'ultima data nella colonna data. In questo caso, la data di fine è determinata dalla funzione MAX, che restituisce l'ultima data nel contesto di filtro. Se, pertanto, il mese di agosto 2017 è nel contesto di filtro, la funzione MAX restituirà 31 agosto 2017 e la funzione DATESBETWEEN
restituirà tutte le date fino al 31 agosto 2017.
Si modificherà quindi la misura rinominandola Nuovi clienti e aggiungendo una seconda variabile per archiviare il numero di clienti diversi prima del periodo di tempo nel contesto di filtro. La clausola RETURN
sottrae ora questo valore dai clienti LTD per produrre un risultato, ovvero il numero di nuovi clienti nel periodo di tempo.
New Customers =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
VAR CustomersPrior =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MIN('Date'[Date]) - 1
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD - CustomersPrior
Per la variabile CustomersPrior, si noti che la funzione DATESBETWEEN
include date fino alla prima data nel contesto di filtro meno uno. Poiché Microsoft Power BI archivia internamente le date come numeri, è possibile aggiungere o sottrarre i numeri per spostare una data.
Calcoli di snapshot
Occasionalmente, i dati della tabella dei fatti vengono archiviati come snapshot nel tempo. Esempi comuni includono i livelli di rimanenze di magazzino o i saldi del conto. Uno snapshot dei valori viene caricato periodicamente nella tabella.
Quando si riepilogano i valori dello snapshot, ad esempio i livelli delle rimanenze di magazzino, è possibile riepilogare i valori in qualsiasi dimensione eccetto la data. L'aggiunta di conteggi del livello di rimanenze tra le categorie di prodotti produce un riepilogo significativo, ma lo stesso non avviene per l'aggiunta di conteggi dei livelli rimanenze tra le date. L'aggiunta del livello di rimanenze del giorno precedente al livello di rimanenze odierno non è un'operazione utile, a meno che non si desideri calcolare la media che ne deriva.
Quando si riepilogano le tabelle di snapshot, le formule delle misure possono basarsi sulle funzionalità di Business Intelligence per le gerarchie temporali DAX per applicare un singolo filtro di data.
Nell'esempio seguente si esaminerà uno scenario per l'azienda Adventure Works. Passare alla visualizzazione modello e selezionare il diagramma del modello Magazzino.
Si noti che il diagramma mostra tre tabelle: Product, Date e Inventory. La tabella Inventory archivia gli snapshot dei saldi di unità per ogni data e prodotto. In particolare, la tabella non contiene date mancanti e nessuna voce duplicata per i prodotti nella stessa data. Inoltre, l'ultimo record dello snapshot viene archiviato per la data del 15 giugno 2020.
Passare quindi alla visualizzazione report e selezionare Pagina 2 del report. Aggiungere la colonna UnitsBalance della tabella Inventory all'oggetto visivo matrice. L'esecuzione del riepilogo predefinita è impostata sui valori di somma.
Questa configurazione visiva è un esempio di come non deve essere riepilogato un valore di snapshot. L'aggiunta dei saldi di snapshot giornalieri non produce un risultato significativo. Rimuovere quindi il campo UnitsBalance dall'oggetto visivo matrice.
A questo punto, alla tabella Inventory verrà aggiunta una misura che somma il valore di UnitsBalanceper una singola data. La data sarà l'ultima data di ogni periodo di tempo. Viene ottenuta tramite la funzione LASTDATE
. Formattare la misura come numero intero con il separatore delle migliaia.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTDATE('Date'[Date])
)
Nota
Si noti che la formula della misura usa la funzione SUM
. È necessario usare una funzione di aggregazione (le misure non consentono riferimenti diretti alle colonne), ma dato che esiste una sola riga per ogni prodotto e per ogni data, la funzione SUM
verrà eseguita solo su una singola riga.
Aggiungere la misura Stock on Hand (Rimanenze di magazzino) all'oggetto visivo matrice. Il valore di ogni prodotto si basa ora sull'ultimo saldo di unità registrato per ogni mese.
La misura non restituisce alcun valore per giugno 2020 perché non esiste alcun record per l'ultima data di giugno. In base ai dati, non si è ancora verificato.
L'applicazione di un filtro in base all'ultima data nel contesto di filtro presenta problemi intrinseci: una data registrata potrebbe non esistere perché non è ancora arrivata o forse perché i saldi di magazzino non vengono registrati nei fine settimana.
Il passaggio successivo consiste nel modificare la formula della misura per determinare l'ultima data con un risultato non vuoto e quindi applicare un filtro in base a tale data. Per ottenere questa attività, è possibile usare la funzione DAX LASTNONBLANK
.
Usare la definizione di misura seguente per modificare la misura Stock on Hand (Rimanenze di magazzino).
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTNONBLANK(
'Date'[Date],
CALCULATE(SUM(Inventory[UnitsBalance]))
)
)
Nell'oggetto visivo matrice si notino i valori per giugno 2020 e il totale, che rappresenta l'intero anno.
La funzione LASTNONBLANK
è una funzione iteratore. Restituisce l'ultima data che produce un risultato non vuoto. Questo risultato viene ottenuto eseguendo l'iterazione di tutte le date nel contesto di filtro in ordine cronologico decrescente. Al contrario, la funzione FIRSTNONBLANK
esegue l'iterazione in ordine cronologico crescente. Per ogni data, valuta l'espressione passata. Quando si rileva un risultato non vuoto, la funzione restituisce la data. Tale data viene quindi usata per filtrare la funzione CALCULATE
.
Nota
La funzione LASTNONBLANK
ne valuta l'espressione nel contesto della riga. La funzione CALCULATE
deve essere usata per eseguire la transizione del contesto di riga al contesto di filtro in modo da valutare correttamente l'espressione.
A questo punto, è necessario nascondere la colonna UnitsBalance della tabella Magazzino. Questo impedirà agli autori del report di riepilogare in modo non appropriato i saldi delle unità degli snapshot.