Power BI
PL-300 : 7 erreurs de DAX, de modèle et de sécurité
Dans Power BI, un total DISTINCTCOUNT ne correspond pas toujours à la somme des lignes. CALCULATE peut remplacer le filtre d’un segment, et cumuler deux rôles RLS peut élargir les données visibles. Ces comportements expliquent plusieurs erreurs de calcul ou de sécurité rencontrées dans les rapports et à comprendre pour PL-300.
1. La moyenne par client renvoie le chiffre d’affaires total
AVERAGEX parcourt les clients, mais cela ne suffit pas à filtrer leurs ventes. Un SUM écrit directement à l’intérieur conserve le même contexte de filtre à chaque tour. Avec deux clients à 100 € et 300 €, il renvoie 400 € à chaque fois. La moyenne reste donc à 400 €.
Appelle plutôt la mesure [CA]. Elle applique ce filtre automatiquement, c’est la transition de contexte, et la moyenne retombe à 200 €.
CA = SUM(Ventes[Montant])
CA moyen par client =
AVERAGEX(VALUES(Clients[ClientId]), [CA])Un client dont [CA] renvoie BLANK sort du calcul. Un client à zéro est inclus et fait baisser la moyenne.
Références : Microsoft : CALCULATE et transition de contexte, Microsoft : AVERAGEX
2. Le total des clients est inférieur à la somme des lignes
Clients actifs = DISTINCTCOUNT(Ventes[ClientId])Un client qui achète dans deux catégories apparaît sur deux lignes, mais une seule fois au total. Avec 60 clients en Jeux et 50 en Livres, dont 20 dans les deux, le total affiche 90. Les 20 clients présents dans les deux catégories ne sont comptés qu’une fois au total.
Pour un indicateur de clients uniques, 90 est le résultat attendu. Additionner les catégories avec SUMX(VALUES(Produits[Categorie]), [Clients actifs]) donne bien 110, mais compte deux fois les 20 clients communs. La mesure répond alors à une autre question. Il faut donc aussi changer son nom, pas seulement son total.
DISTINCTCOUNT compte aussi BLANK comme une valeur. Pour exclure les identifiants vides, utilise DISTINCTCOUNTNOBLANK.
Références : Microsoft : DISTINCTCOUNT et totaux
3. La moyenne des taux de marge ne donne pas la marge globale
Une vente de 100 € à 50 % de marge et une vente de 1 000 € à 10 % font 30 % en moyenne simple. La marge réelle est de 150 € sur 1 100 €, soit 13,6 %. Il faut diviser la somme des marges par la somme des ventes.
Vérifie d’abord que Montant et Cout sont dans la même devise et au même niveau de détail. Si le coût d’une commande est recopié sur chacune de ses lignes, la formule le soustrait plusieurs fois.
Marge sur CA =
DIVIDE(
SUM(Ventes[Montant]) - SUM(Ventes[Cout]),
SUM(Ventes[Montant])
)Sans valeur de remplacement, DIVIDE renvoie BLANK quand le dénominateur vaut zéro ou est vide. Afficher 0 % ferait croire à une marge nulle, alors que le ratio n’existe pas.
Références : Microsoft : DIVIDE
4. La mesure ignore la couleur choisie dans le segment
Avec une relation active entre Produits et Ventes, cette mesure force Rouge sur la colonne Couleur. Si le lecteur du rapport a choisi Bleu dans un segment sur la même colonne, son choix est remplacé.
CA rouge = CALCULATE([CA], Produits[Couleur] = "Rouge")Pour ne garder que les ventes rouges parmi les couleurs sélectionnées, ajoute KEEPFILTERS. Les deux filtres s’appliquent alors en même temps.
CA rouge dans la selection =
CALCULATE([CA], KEEPFILTERS(Produits[Couleur] = "Rouge"))Si le segment ne garde que Bleu, aucune vente n’est à la fois bleue et rouge, et la mesure renvoie BLANK. Les filtres posés sur les autres colonnes ne bougent pas.
Références : Microsoft : CALCULATE et transition de contexte, Microsoft : KEEPFILTERS
5. Le chiffre d’affaires reste calé sur la date de commande
Dans ce modèle, Calendrier filtre Ventes par DateCommande. Un visuel construit sur Calendrier[Date] répartit donc le chiffre d’affaires par date de commande. Pour calculer sur DateLivraison, une seconde relation doit déjà exister entre Calendrier et DateLivraison. Elle est forcément inactive, car une seule relation peut être active entre deux tables. La mesure l’active le temps du calcul.
CA livre =
CALCULATE(
[CA],
USERELATIONSHIP(Calendrier[Date], Ventes[DateLivraison])
)La RLS ne se propage jamais par une relation inactive, même avec USERELATIONSHIP. Une mesure qui utilise USERELATIONSHIP peut aussi renvoyer une erreur quand la RLS est définie sur une table de la relation activée. Dès que des rôles RLS existent, ou que les visuels doivent filtrer par les deux dates à la fois, Microsoft recommande une table de dates par usage, chacune reliée activement à Ventes.
Références : Microsoft : relations actives, inactives et RLS
6. Les « doublons » sont en fait l’historique du produit
Dans une dimension historisée de type 2, un produit a une ligne par version, chacune avec sa clé technique. Un produit qui a changé deux fois de gamme a donc trois lignes. Chaque vente porte la clé de la version valable à sa date.
Le bouton « Supprimer les doublons » ferait disparaître le problème visuel, mais aussi l’historique. Garde les versions et relie Ventes à leur clé technique, unique dans la dimension. Une relation plusieurs-à-plusieurs sur le seul code produit ne sait pas choisir la version valable à la date de vente.
Références : Microsoft : modèle en étoile et dimensions historisées
7. Un rôle RLS de plus élargit les droits
Les autorisations de plusieurs rôles RLS s’additionnent. Un utilisateur qui cumule les rôles France et Île-de-France garde l’accès à toute la France. Avant de conclure, regarde tous les rôles attribués à la personne, directement ou par les groupes de sécurité dont elle est membre.
Le compte utilisé pour le test compte aussi. Dans l’espace de travail, la RLS s’applique au Viewer, pas aux rôles Admin, Member ou Contributor. Pour vérifier ce qu’un lecteur voit réellement, reprends ses droits dans l’espace de travail et l’ensemble de ses rôles RLS.
Références : Microsoft : sécurité au niveau des lignes
Sources
- Microsoft : CALCULATE et transition de contexte
- Microsoft : AVERAGEX
- Microsoft : DISTINCTCOUNT et totaux
- Microsoft : DIVIDE
- Microsoft : KEEPFILTERS
- Microsoft : relations actives, inactives et RLS
- Microsoft : modèle en étoile et dimensions historisées
- Microsoft : sécurité au niveau des lignes
Préparation indépendante, sans affiliation aux éditeurs. Une information à corriger ? Signaler le passage concerné.
Retrouve ces sujets dans nos questions PL-300
Entraîne-toi sur DAX, les relations et la RLS avec DataCertification. Les corrections expliquent le filtre, la relation ou le droit qui détermine la réponse, pour réutiliser le raisonnement sur un autre cas.
Faire le test PL-300 gratuit