Usare SELECTEDVALUE invece di VALUES

Gli autori di modelli di dati potrebbero avere a volte l'esigenza di scrivere un'espressione DAX che verifica se una colonna è filtrata in base a un valore specifico.

Nelle versioni precedenti di DAX questa esigenza poteva essere soddisfatta in modo sicuro usando un modello che coinvolge tre funzioni DAX. IF, HASONEVALUE e VALUES. Nella definizione di misura seguente viene presentato un esempio. Calcola l'importo dell'imposta di vendita, ma solo per le vendite effettuate ai clienti australiani.

Australian Sales Tax =
IF(
    HASONEVALUE(Customer[Country-Region]),
    IF(
        VALUES(Customer[Country-Region]) = "Australia",
        [Sales] * 0.10
    )
)

In questo esempio la funzione HASONEVALUE restituisce TRUE solo quando un singolo valore della colonna Country-Region è visibile nel contesto di filtro corrente. Quando è TRUE, la funzione VALUES viene confrontata con il testo letterale "Australia". Quando la funzione VALUES restituisce TRUE, la misura Sales viene moltiplicata per 0,10 (che rappresenta il 10%). Se la funzione HASONEVALUE restituisce FALSE, poiché più di un valore filtra la colonna, la prima funzione IF restituisce BLANK.

L'uso di HASONEVALUE è una tecnica difensiva. È necessario perché è possibile che più valori filtrino la colonna Country-Region. In questo caso, la funzione VALUES restituisce una tabella di più righe. Il confronto tra una tabella di più righe e un valore scalare causa un errore.

Recommendation

Si consiglia di usare la funzione SELECTEDVALUE. Ottiene lo stesso risultato del modello descritto in questo articolo, ma in modo più efficiente ed elegante.

La definizione della misura di esempio viene ora riscritta usando la funzione SELECTEDVALUE.

Australian Sales Tax =
IF(
    SELECTEDVALUE(Customer[Country-Region]) = "Australia",
    [Sales] * 0.10
)

Suggerimento

È possibile passare un valore di risultato alternativo nella funzione SELECTEDVALUE. Il valore del risultato alternativo viene restituito quando alla colonna non è applicato alcun filtro o sono applicati più filtri.