Les fonctions logiques et les fonctions d'information
Introduction
Ce chapitre est consacré à un ensemble de fonctions dont le rôle n’est pas directement d’effectuer un calcul en vue d’une analyse, mais plutôt d’évaluer la situation (ce qui est souvent synonyme d’évaluation du contexte de filtre) afin de déterminer si ou comment le calcul doit être effectué.
Les notions qui y sont abordées se retrouvent très fréquemment dans les formules DAX et évitent bien souvent des erreurs de calcul.
Ces fonctions se répartissent en deux familles. Les fonctions logiques sont à la base du traitement conditionnel, le Si .. Alors .. Sinon que DAX implémente avec la fonction IF. Il s’agit de faire un test, et de n’effectuer le calcul que si le test est positif (vrai).
La deuxième famille comprend les fonctions d’information : celles-ci renseignent sur l’état du contexte. Des fonctions comme ISBLANK, SELECTEDVALUE ou encore VALUES permettent de savoir quelles valeurs sont actuellement sélectionnées.
Les fonctions d’information sont souvent utilisées à l’intérieur d’un traitement conditionnel :
IF(
ISINSCOPE(demo[Sous Categorie]) ,
RANKX(
ALL(demo),
[val]
)
Cette formule, que nous avons vu précédemment, n’effectue le classement que si nous sommes au niveau d’une sous-catégorie.
Le traitement conditionnel et les fonctions logiques
La famille des fonctions logiques comprend IF, AND, OR, TRUE, FALSE, NOT et IFERROR.
La fonction IF et ses variantes
Derrière son apparente simplicité, le traitement conditionnel recèle de nombreuses variantes et de nombreux cas d’utilisation.
Rappelons tout d’abord la syntaxe de la fonction IF, à la base de tout ce qui suit :
IF(
test,
action si vrai,
action si faux
)
Le test peut être simple :
produits[couleur] = "Rouge"
Il peut aussi intégrer les fonctions logiques AND et OR et devenir complexe :
produit rouge cher ou produit vert =
IF(
OR(
produits[couleur] = "Vert" ,
AND(
produits[prix unitaire] > 50 ,
produits[couleur] = "Rouge"
)
) ,
"vert ou rouge cher" ,
"autres"
)
AND et OR n’acceptent que deux arguments, utilisez && ou || s’il y en a plus :
produit rouge entre 20 et 50 =
IF(
produits[prix unitaire] > 20 &&
produits[prix unitaire] < 50 &&
produits[couleur] = "Rouge",
"Rouge entre 20 et 50" ,
"Autres"
)
Attention, pour les exemples...
Les fonctions d’information
Les fonctions d’information ont le plus souvent pour rôle de renseigner sur l’état du contexte de filtre (quelles valeurs y sont contenues, quels champs sont filtrés, etc.).
Parmi les principales fonctions, nous trouvons :
-
ISBLANK
-
ISEMPTY
-
FILTERS
-
VALUES
-
ISFILTERED
-
ISCROSSFILTERED
-
HASONEVALUE
-
SELECTEDVALUE*
-
ISINSCOPE*
* ces fonctions ne sont pas disponibles pour Excel.
ISBLANK, ISEMPTY
ISBLANK(<value>)
ISEMPTY(<table_expression>)
Ces deux fonctions retournent vrai ou faux.
La seconde est très facile à comprendre : si une table ou une expression de table (une table calculée) ne contient aucune ligne dans le contexte de filtre, alors ISEMPTY est vraie. ISEMPTY est le plus fréquemment utilisé dans un traitement conditionnel dans le cadre d’une formule DAX complexe.
La notion de valeur vide dans DAX (« blank » pour reprendre le terme anglais) est plus compliquée. Je fais le choix de le présenter de manière simple ici. ISBLANK teste une valeur (c’est-à-dire une mesure, une expression, ou une colonne), et retourne vrai si celle-ci est vide.
Nous avons pu voir au point précédent que la fonction COALESCE effectue précisément ce test, et que le résultat est conforme à ce que nous pouvons attendre.
ISBLANK, au même titre que ISEMPTY, est le plus fréquemment utilisé dans un traitement conditionnel.
La valeur BLANK est importante en DAX, dans la mesure où Power BI ajoute toujours une ligne vide (blank) aux tables de dimensions (par exemple les produits), lorsque la table des transactions référence des ventes qui ne sont liées à aucun produit (ou catégorie pour le coup) dans la table des produits. Cette situation peut en effet se présenter.
Il n’est donc pas rare de voir apparaître...
Exercices
Les exercices proposés ici sont tous basés sur le fichier chap7_librairie.pbix.
Ces exercices font appel à différentes fonctions abordées dans l’ensemble du chapitre.
Le traitement conditionnel et les fonctions logiques
IF
Le premier exercice consiste à réaliser le rapport suivant :
Il est composé de trois segments et d’un tableau. La première colonne du tableau est une mesure que vous devrez créer : elle répartit les clients en deux catégories, celle de petites commandes (montant total par client inférieur à 20 €) et celle des grosses commandes (montant total supérieur ou égal à 20 €). Faites bien attention à la ligne de total.
Enregistrez le résultat, nous en aurons besoin un peu plus tard.
SWITCH
Dans cet exercice, vous devez établir une typologie des clients et compter le nombre de clients dans chaque catégorie :
Un client inactif n’a passé aucune commande, un client argent a dépensé moins de 50 €, un client or entre 50 € et 100 €, un client platine plus de 100 €.
Les fonctions d’information
FILTERS, VALUES
Reprenez le premier exercice et construisez un titre dynamique à votre rapport :
Le titre est une mesure placée dans un visuel de type carte et doit bien entendu correspondre aux choix faits dans les segments.
Nous supposons que le lecteur du rapport choisira toujours au moins une valeur dans le segment Signification.
HASONEVALUE, SELECTEDVALUE, ISINSCOPE
Dans cet exercice, vous devez construire un tableau où figurent les trois meilleurs livres dans chaque catégorie, en fonction du montant des ventes.
Pour une question de lisibilité, vous pouvez ajouter un segment et sélectionner quelques unes seulement des catégories :
Corrigés
Le traitement conditionnel et les fonctions logiques
IF
Ici, il n’y a pas de piège particulier, sinon que cette mesure n’a de sens qu’au niveau « global » du client, c’est-à-dire au niveau de ses ventes totales.
En revanche, il s’agit d’obtenir un rapport « propre » : la ligne de total en bas du tableau ne doit pas afficher « grosse commande », comme c’est le cas par défaut (en effet, sur cette ligne, le total est bien supérieur à 20 !). Et d’autres part, certains clients n’ont pas passé de commandes, ils ne doivent pas apparaître dans le tableau.
En définitive, voici ce que je vous propose :
Créez la mesure suivante :
Petites ou grosses commandes =
IF(
[montant] > 0 && HASONEVALUE(Clients[Nom]),
IF(
[montant] > 20,
"Grosse commande",
"Petite commande"
)
)
Créez ensuite un tableau ayant pour colonnes Petites ou grosses commandes, Nom et montant.
Créez ensuite les trois segments basés sur les champs Signification, Année et Trimestre.
SWITCH
La première partie de la réponse consiste à créer une colonne. Attention, il s’agit bien d’une colonne : elle va servir à structurer un tableau et vous constaterez rapidement qu’une mesure ne le permet pas.
Il y a plusieurs cas de figure, c’est donc l’occasion d’utiliser SWITCH, même si vous pouvez obtenir le même résultat avec des IF imbriqués. Le motif SWITCH(TRUE())...