Utiliser SELECTEDVALUE à la place de VALUES

En tant que modeleur de données, vous pouvez parfois avoir besoin d’écrire une expression DAX qui teste si une colonne est filtrée par une valeur spécifique.

Dans les versions antérieures de DAX, cette condition a été remplie sans problème avec un modèle impliquant trois fonctions DAX ; IF, HASONEVALUE et VALUES. La définition de mesure suivante présente un exemple. Elle calcule le montant des taxes de vente, mais uniquement pour les ventes effectuées auprès de clients australiens.

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

Dans l’exemple, la fonction HASONEVALUE retourne TRUE uniquement lorsqu’une valeur de la colonne Country-Region est visible dans le contexte filtré actuel. Quand la valeur est TRUE, la fonction VALUES est comparée au texte littéral « Australia ». Lorsque la fonction VALUES retourne la valeur TRUE, la mesure Sales est multipliée par 0,10 (qui représente 10 %). Si la fonction HASONEVALUE retourne la valeur FALSE (car plusieurs valeurs filtrent la colonne), la première fonction IF retourne BLANK.

L’utilisation de HASONEVALUE est une technique défensive. Elle est nécessaire parce qu’il est possible que plusieurs valeurs filtrent la colonne Country-Region. Dans ce cas, la fonction VALUES retourne une table de plusieurs lignes. La comparaison d’une table de plusieurs lignes à une valeur scalaire génère une erreur.

Recommandation

Il est recommandé d’utiliser la fonction SELECTEDVALUE. Elle permet d’obtenir le même résultat que le modèle décrit dans cet article, mais de manière plus efficace et plus élégante.

En utilisant la fonction SELECTEDVALUE, l’exemple de définition de mesure est maintenant réécrit.

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

Conseil

Il est possible de passer une valeur de résultat alternatif dans la fonction SELECTEDVALUE. La valeur de résultat alternatif est retournée quand aucun filtre n’est appliqué ou plusieurs filtres sont appliqués à la colonne.