Utilizar SELECTEDVALUE em vez de VALUES

Como um modelador de dados, às vezes você pode precisar escrever uma expressão DAX que testa se uma coluna é filtrada por um valor específico.

Em versões anteriores do DAX, esse requisito era alcançado com segurança usando um padrão envolvendo três funções DAX; IF, HASONEVALUE e VALORES. A seguinte definição de medida apresenta um exemplo. Ele calcula o valor do imposto sobre vendas, mas apenas para vendas feitas a clientes australianos.

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

No exemplo, a função HASONEVALUE retorna TRUE somente quando um único valor da coluna País-Região é visível no contexto de filtro atual. Quando é TRUE, a função VALUES é comparada com o texto literal "Austrália". Quando a função VALUES retorna TRUE, a medida Sales é multiplicada por 0,10 (representando 10%). Se a função HASONEVALUE retornar FALSE, porque mais de um valor filtra a coluna, a primeira função IF retornará BLANK.

O uso do HASONEVALUE é uma técnica defensiva. É necessário porque é possível que vários valores filtrem a coluna País-Região . Nesse caso, a função VALUES retorna uma tabela de várias linhas. A comparação de uma tabela de várias linhas com um valor escalar resulta em um erro.

Recomendação

É recomendável usar a função SELECTEDVALUE . Alcança o mesmo resultado que o padrão descrito neste artigo, ainda de forma mais eficiente e elegante.

Usando a função SELECTEDVALUE, a definição de medida de exemplo agora é reescrita.

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

Gorjeta

É possível passar um valor de resultado alternativo para a função SELECTEDVALUE. O valor de resultado alternativo é retornado quando nenhum filtro — ou vários filtros — são aplicados à coluna.