Condividi tramite


Usa le variabili per migliorare le formule di DAX

Come modello di dati, la scrittura e il debug di alcuni DAX calcoli possono risultare difficili. È comune che i requisiti di calcolo complessi spesso implicano la scrittura di espressioni composte o complesse. Le espressioni composte possono comportare l'uso di molte funzioni annidate ed eventualmente il riutilizzo della logica dell'espressione.

L'uso delle variabili nelle DAX formule consente di scrivere calcoli più complessi ed efficienti. Le variabili possono migliorare le prestazioni, l'affidabilità, la leggibilità e ridurre la complessità.

In questo articolo verranno illustrati i primi tre vantaggi usando una misura di esempio per la crescita annuale delle vendite (YoY). La formula per la crescita delle vendite YoY è le vendite del periodo, meno le vendite per lo stesso periodo dell'anno precedente, diviso per le vendite per lo stesso periodo dell'anno precedente.

Si inizierà con la definizione di misura seguente.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

La misura produce il risultato corretto, ma ora vediamo come può essere migliorata.

Migliorare le prestazioni

Si noti che la formula ripete l'espressione che calcola lo stesso periodo dell'anno precedente. Questa formula è inefficiente, perché richiede a Power BI di valutare due volte la stessa espressione. La definizione della misura può essere resa più efficiente usando una variabile , VAR.

La definizione di misura seguente rappresenta un miglioramento. Usa un'espressione per assegnare il risultato "stesso periodo dell'anno precedente" a una variabile denominata SalesPriorYear. La variabile viene quindi usata due volte nell'espressione RETURN.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

La misura continua a produrre il risultato corretto e lo fa in circa metà del tempo di query.

Migliorare la leggibilità

Nella definizione di misura precedente si noti che la scelta del nome della variabile semplifica la comprensione dell'espressione RETURN. L'espressione è breve e autodescrittiva.

Semplificare il debug

Le variabili consentono anche di eseguire il debug di una formula. Per testare un'espressione assegnata a una variabile, si riscrive temporaneamente l'espressione RETURN in modo che restituisca la variabile.

La definizione di misura seguente restituisce solo la variabile SalesPriorYear . Nota come l'espressione RETURN prevista viene commentata. Questa tecnica consente di ripristinarla facilmente al termine del debug.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

Riduci la complessità

Nelle versioni precedenti di DAX, le variabili non erano ancora supportate. Sono state necessarie espressioni complesse che hanno introdotto nuovi contesti di filtro per usare le EARLIER funzioni o EARLIESTDAX per fare riferimento a contesti di filtro esterni. Sfortunatamente, i modelli di dati hanno rilevato che queste funzioni sono difficili da comprendere e usare.

Le variabili vengono sempre valutate al di fuori dei filtri applicati dall'espressione RETURN. Per questo motivo, quando si usa una variabile all'interno di un contesto di filtro modificato, ottiene lo stesso risultato della EARLIEST funzione. È quindi possibile evitare l'uso delle funzioni EARLIER o EARLIEST. Significa che ora è possibile scrivere formule meno complesse e più facili da comprendere.

Si consideri la definizione di colonna calcolata seguente aggiunta alla tabella Subcategory. Valuta una classificazione per ogni sottocategoria di prodotto in base ai valori della colonna Subcategory Sales .

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

La EARLIER funzione viene usata per fare riferimento al valore della colonna Subcategory Salesnel contesto di riga corrente.

La definizione di colonna calcolata può essere migliorata usando una variabile anziché la funzione EARLIER. La variabile CurrentSubcategorySales archivia il valore della colonna Subcategory Salesnel contesto di riga corrente e l'espressione RETURN la usa all'interno di un contesto di filtro modificato.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1