Contenidos
J'allais titrer ce blog "MEDIANX and X Features", mais cela ressemblait trop à un groupe des années 2030j'ai donc opté pour les retours de MEDIANX vides dans DAX. Mais l'article couvre plus que MEDIANX et le «problème» vierge. Mais d'abord un peu de contexte.
A aidé un client avec un problème étrange cette semaine - une mesure retournait BLANK alors qu'intuitivement elle aurait dû renvoyer une certaine valeur. Il y avait beaucoup d'éléments mobiles dans le problème réel et la façon dont je l'ai résolu, et je n'entrerai pas dans tous ces détails. Cependant, ce que je vais faire, c'est utiliser mon expérience et ce que j'ai appris cette semaine pour partager quelques idées pour vous dans cet article:
- Que fait une fonction X
- Comment créer et utiliser des tables de test dans DAX
- MEDIANX, contre AVERAGEX
- La manière clémente que DAX évalue la définition de BLANK
Si vos yeux ne sont pas vitreux maintenant, lisez la suite.
Que fait une fonction X
Une fonction X est une classe de fonctions dans DAX qui sont également appelées «itérateurs» (notez qu'il existe également d'autres fonctions itératives, telles que FILTER, mais je ne parle ici que des fonctions X). C'est un excellent sujet en soi, et cet article ne sera pas le guide définitif des fonctions X. Mais je vais vous donner quelques idées.
J'ai beaucoup appris sur la façon d'enseigner DAX aux gens au cours des 6 dernières années, et mes méthodes d'enseignement ont évolué pendant cette période. Je me souviens avoir parlé affectueusement au Microsoft Data Insights Summit avec Will Thompson sur le sujet «DAX 50 - DAX pour le reste d'entre nous». Will m'a dit "ne mentionnez pas le mot" itérateur "car c'est trop déroutant." Je n'étais pas d'accord avec Will à l'époque, mais son commentaire m'a marqué. Au fil du temps, j'ai changé ma façon d'enseigner DAX. Ces jours-ci, je montre aux gens comment ajouter une colonne calculée à un tableau (tout le monde peut le faire, c'est tellement simple). Ensuite, j'explique qu'une fonction X fait exactement la même chose, c'est juste que vous ne pouvez pas voir les résultats intermédiaires matérialisés sous leurs yeux.
Regardons un exemple pour plus de clarté.
Exemple
J'utilise mon schéma en étoile simple Adventure Works standard pour cet exemple.
Disons que je veux écrire une mesure qui renvoie le montant médian dépensé pour tous les clients. Le problème est que je n'ai pas le total des ventes pour chaque client dans mon modèle de données. J'ai une table des clients et une table des ventes, mais nulle part les ventes totales pour chaque client.
Maintenant, je pourrais calculer la médiane des ventes de tous les clients en calculant d'abord les ventes totales de chaque client dans une colonne calculée dans le tableau des clients, puis en ajoutant une image à mon rapport pour calculer la médiane comme indiqué ci-dessous.
Mesure: Ventes totales = SOMME (Ventes [ExtendedAmount])
J'ai créé une colonne calculée dans le tableau des clients: Ventes personnalisées = [Ventes totales]
Comme vous pouvez le voir ci-dessus, je peux maintenant voir le total des ventes pour chaque client.
Ensuite, tout ce que vous aviez à faire était d'ajouter une image au canevas du rapport (1 ci-dessous), d'ajouter la colonne calculée (2) et de définir l'agrégation sur MEDIUM (3).
Comme vous pouvez le voir dans l'image ci-dessus, la réponse est 270,27. Le problème avec cette approche est que j'ai dû écrire une colonne calculée pour obtenir la réponse. Bien qu'il existe une heure et un lieu pour une colonne calculée, vous n'avez pas besoin de créer une colonne calculée pour obtenir cette réponse. Le point que j'essaie de faire valoir est que la colonne calculée ci-dessus est conceptuellement facile à comprendre pour quiconque. C'est facile à écrire, vous pouvez résoudre le problème étape par étape, vous pouvez voir les résultats intermédiaires, et toute personne ayant de l'expérience dans Excel peut le faire avec très peu de compréhension de DAX. Comprendre la fonction MEDIANX est beaucoup plus difficile; plus difficile jusqu'à ce que vous vous rendiez compte que MEDIANX fait EXACTEMENT la même chose que cette colonne calculée.
Voici la formule MEDIANX.
Mesure médiane des ventes des clients = MÉDIANX(Les clients, [Ventes totales])
Dans la formule ci-dessus
- Le X (bleu) est l'indicateur qu'il s'agit d'une fonction X. C'est l'indice que c'est l'une des fonctions qui se comporte comme une colonne calculée.
- Le tableau (vert) est le tableau dans lequel vous auriez écrit votre colonne calculée si vous l'aviez fait de cette façon.
- La mesure (orange) est la formule à l'intérieur de la colonne calculée que vous auriez écrite si vous l'aviez fait de cette façon.
- MOYEN (rouge) est ce qui arrive aux nombres à la fin.
Voici la leçon: Une fonction X est exactement la même qu'une colonne calculée. Les seules différences sont que 1) vous ne pouvez pas REGARDER ce qui se passe et 2) ne stocke pas en permanence les résultats ligne par résultat. Mais le processus de calcul est identique.
Maintenant, la vérité est qu'il se passe beaucoup de choses sous le capot pour obtenir ce résultat. Il y a une fonction CALCULATE implicite cachée, il y a un contexte de ligne et une transition de contexte, mais le fait est qu'il n'est pas essentiel que vous compreniez toutes ces choses techniques afin d'en savoir un peu plus sur l'utilisation et la compréhension de DAX. La façon dont j'enseigne DAX ces jours-ci est de montrer aux gens comment créer une colonne calculée, puis de montrer aux gens que la même chose peut être faite (dans ce cas) en utilisant une mesure et une fonction X. La morale ici est, si vous essayez pour écrire une mesure, vous êtes bloqué et savez comment le faire en tant que colonne calculée, puis créez d'abord la colonne, puis découvrez comment la migrer vers une mesure à partir de là en utilisant le principe que j'ai démontré.
Comment créer et utiliser des tables de test dans DAX
Revenons maintenant au problème du client: pourquoi MEDIANX a-t-il renvoyé un espace vide? Il m'est apparu que le moyen le plus simple de visualiser ce qui se passait était de créer une table de valeurs d'exécution à l'aide des opérateurs d'accolade {}. J'ai appris à quel point cette technique est utile lorsque je regarde des démos et des messages de deux personnes vraiment intelligentes de DAX (Phil Seamark et Owen Auger).
Mesure de test = MÉDIANX({1,2,3,6,9},[Valeur])
La façon dont cette mesure fonctionne est que le bit entre parenthèses (vert) génère une table d'exécution. La partie orange [Value] me permet d'accéder aux valeurs de la seule colonne du tableau que je viens de créer. Les bits rouge et bleu sont les mêmes qu'avant.
La fonction ci-dessus a renvoyé 3
J'ai donc décidé d'essayer AVERAGEX
Pour mémoire, AVERAGEX renverra la valeur moyenne (total divisé par le décompte) tandis que MEDIANX renverra la valeur moyenne. En cas d'égalité pour la valeur moyenne (c'est-à-dire un nombre pair de valeurs), il s'agit de la moyenne des 2 valeurs moyennes.
Ensuite, j'ai écrit la mesure de test suivante.
Ensuite ceci
Et puis le sou est tombé pour moi. Et si j'écrivais ça?
Ces mesures de test m'ont vraiment aidé à comprendre ce qui se passait sous le capot, et j'espère que cela vous a également aidé.
Le langage DAX est très indulgent.
DAX est un langage très indulgent. Dans de nombreux autres langages (la plupart), un espace vide ou nul ne donne pas le même résultat que 0. Dans le langage DAX, un espace vide ou nul sera évalué à 0 à moins que vous ne lui disiez explicitement qu'il ne le fait pas, en utilisant le nouveau == (double signe égal). En d'autres termes, 0 = BLANK () est TRUE, tandis que 0 == BLANK () est faux. J'appelle le double signe égal «vraiment égal», mais le nom officiel est «strictement égal à».
Mesure de test = MEDIANX ({BLANK (), BLANK (), BLANK (), 6,9}, [Value])
Dans cet esprit, la mesure de test qui a été répétée ci-dessus consiste à évaluer les blancs comme s'ils étaient numériquement 0 lors de l'évaluation médiane, et enfin à renvoyer le BLANK natif () à la fin. Bien sûr, la différence entre la moyenne et la médiane est que la médiane renvoie le nombre à partir du point médian. Dans ce cas, le milieu est un espace vide et c'est donc le résultat qui a été renvoyé.
Maintenant, si vous ne voulez pas que les blancs soient traités comme 0, vous devrez les filtrer avant de calculer la médiane.
Ignorer BLANKS () sur un MEDIANX
Cela s'est avéré un peu plus compliqué que je ne le pensais. J'avais d'abord besoin d'un nouvel échantillon à tester. J'ai créé une autre colonne calculée, cette fois dans la table Produits. Je savais par expérience précédente que tous les produits n'étaient pas vendus, donc cela renverrait des blancs. Voir ci-dessous.
Lorsque j'ai ajouté cette colonne en tant que carte à mon rapport et défini l'agrégation sur MOYENNE, c'est ce que j'ai obtenu.
Quand j'ai écrit la mesure de test équivalente en utilisant MEDIANX, c'est ce que j'ai obtenu
Je dois donc dire que j'ai été très surpris que ma colonne calculée et mes mesures me donnent un résultat différent. Après un peu plus de tests et de recherches, il s'avère que lorsque vous utilisez une colonne sur une carte dans Power BI et que vous trouvez la valeur médiane, le visuel filtre automatiquement les BLANKS, que vous le vouliez ou non. Je ne voyais aucun moyen de changer ce comportement.
Partie 2 la semaine prochaine
Résoudre le problème de MEDIANX en tant que mesure est un peu plus difficile qu'avec une colonne. Le problème est que la colonne n'existe pas réellement lorsque vous la saisissez en tant que mesure, mais vous devez toujours filtrer les blancs avant de faire le calcul. Vous pouvez essayer d'écrire une mesure comme celle-ci ...
Mesure de test 1 = MEDIANX (Produits, si ([Ventes totales] = 0, VIDE (), [Ventes totales]))
mais vous vous retrouverez avec le même résultat, car l'un des résultats de l'instruction IF ajoute simplement à nouveau le BLANK ().
Écrire une mesure pour cela est un excellent sujet en soi, et je vais vous expliquer comment vous pouvez utiliser DAX Studio (étape par étape) pour résoudre un tel problème dans mon prochain article la semaine prochaine.