Evitare l'uso di FILTER come argomento di filtro

Chi si occupa della modellazione dei dati si trova spesso a scrivere espressioni DAX che devono essere valutate in un contesto di filtro modificato. È ad esempio possibile scrivere una definizione di misura per calcolare le vendite per i prodotti con margine elevato. Questo calcolo verrà descritto più avanti nell'articolo.

Nota

Questo articolo riguarda in particolare i calcoli dei modelli che applicano filtri alle tabelle di importazione.

Le funzioni DAX CALCULATE e CALCULATETABLE sono importanti e utili. Consentono di scrivere calcoli per la rimozione o l'aggiunta di filtri o per la modifica dei percorsi delle relazioni. A tale scopo, vengono passati argomenti di filtro che sono espressioni booleane, espressioni di tabella o funzioni di filtro speciali. In questo articolo verranno illustrate solo le espressioni booleane e di tabella.

Si consideri la definizione di misura seguente, che consente di calcolare le vendite dei prodotti rossi usando un'espressione di tabella. L'istruzione sostituisce i filtri applicati alla tabella Product.

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

La funzione CALCULATE accetta un'espressione di tabella restituita dalla funzione DAX FILTER che valuta l'espressione filtro per ogni riga della tabella Product. Ottiene il risultato corretto, ovvero le vendite per i prodotti rossi. È tuttavia possibile ottenere lo stesso risultato in modo molto più efficiente usando un'espressione booleana.

Ecco una definizione di misura migliorata che usa un'espressione booleana invece dell'espressione di tabella. La funzione DAX KEEPFILTERS garantisce che tutti i filtri esistenti applicati alla colonna Color vengano mantenuti, non sovrascritti.

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

È consigliabile passare argomenti di filtro come espressioni booleane, quando possibile. Ciò perché le tabelle dei modelli di importazione sono archivi di colonne in memoria. Sono ottimizzate in modo esplicito per filtrare efficacemente le colonne in questo modo.

Alle espressioni booleane usate come argomenti di filtro si applicano tuttavia alcune restrizioni, ovvero:

  • Impossibile fare riferimento a colonne da più tabelle
  • Non possono fare riferimento a una misura
  • Non possono usare funzioni CALCULATE annidate
  • Non possono usare funzioni che analizzano o restituiscono una tabella

Ciò significa che per i requisiti di filtro più complessi è necessario usare le espressioni di tabella.

Si consideri ora una definizione di misura diversa. Il requisito è quello di calcolare le vendite, ma solo per i mesi che hanno ottenuto un profitto.

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0)
    )
)

In questo esempio è necessario usare la funzione FILTER. Ciò perché è necessario valutare la misura Profit per eliminare i mesi in cui non è stato ottenuto un profitto. Non è possibile usare una misura in un'espressione booleana quando viene usata come argomento di filtro.

Consigli

Per ottenere prestazioni ottimali, è consigliabile usare espressioni booleane come argomenti di filtro, quando possibile.

La funzione FILTER deve quindi essere usata solo quando è necessario. È possibile usarla per eseguire confronti tra colonne con filtro complesso. Questi confronti tra colonne possono includere:

  • Misure
  • Altre colonne
  • Uso della funzione DAX OR o dell'operatore logico OR (||)