Evitare di usare FILTER come argomento di filtro
In qualità di modellatore di dati, è comune 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 è particolarmente rilevante per i calcoli del modello che applicano filtri alle tabelle di importazione.
Le funzioni CALCULATE e CALCULATETABLEDAX sono funzioni importanti e utili. Consentono di scrivere calcoli che rimuovono o aggiungono filtri o modificano i percorsi delle relazioni. Questa operazione viene eseguita passando argomenti di filtro, ovvero espressioni booleane, espressioni di tabella o funzioni di filtro speciali. In questo articolo verranno illustrate solo espressioni booleane ed espressioni di tabella.
Si consideri la definizione di misura seguente, che calcola le vendite di prodotti rossi usando un'espressione di tabella. Sostituirà tutti i filtri che potrebbero essere applicati alla tabella Product.
Red Sales =
CALCULATE(
[Sales],
FILTER('Product', 'Product'[Color] = "Red")
)
La funzione CALCULATE accetta un'espressione di tabella restituita dalla funzione FILTERDAX, che valuta l'espressione di 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 anziché l'espressione di tabella. La funzione KEEPFILTERSDAX assicura che tutti i filtri esistenti applicati alla colonna Color vengano mantenuti e 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 ottimizzati in modo esplicito per filtrare in modo efficiente le colonne in questo modo.
Esistono tuttavia restrizioni che si applicano alle espressioni booleane quando vengono usate come argomenti di filtro. ovvero:
- Impossibile fare riferimento a colonne da più tabelle
- Impossibile fare riferimento a una misura
- Non è possibile usare funzioni di CALCULATE annidate
- Impossibile utilizzare funzioni che analizzano o restituiscono una tabella
Ciò significa che è necessario usare espressioni di tabella per requisiti di filtro più complessi.
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. La necessità di valutare la misura Profit è dovuta al fatto di dover eliminare quei mesi che non hanno raggiunto 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.
Pertanto, la funzione FILTER deve essere usata solo quando necessario. È possibile usarlo per eseguire confronti complessi tra colonne utilizzando filtri. Questi confronti tra colonne possono includere:
- Misure
- Altre colonne
- Uso della funzione ORDAX o dell'operatore logico OR (||)
Contenuto correlato
- funzioni filtro (DAX)
- Percorso di apprendimento: Usare DAX in Power BI Desktop
- Domande? Provare a chiedere alla community di Power BI
- inviare suggerimenti, Contribuire con idee per migliorare Power BI