Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Dans ce didacticiel, nous allons examiner un morceau de code DAX. Vous avez peut-être déjà utilisé quelque chose comme ça. Ou, vous pouvez le rencontrer et être confus quant au fonctionnement de ce code et à la façon dont le contexte de ligne et le contexte de filtre semblent interagir les uns avec les autres dans un seul code DAX. Quoi qu'il en soit, ce didacticiel examinera en détail tout ce qui précède. Vous pouvez regarder la vidéo complète de ce tutoriel au bas de ce blog.

Tout d'abord, nous allons examiner le code lui-même. Ensuite, nous passerons en revue la partie théorique pour mieux comprendre. Enfin, nous examinerons tout ce qui se cache derrière en utilisant DAX Studio .

Le modèle de données que nous allons utiliser est essentiellement un modèle de données de vente simple qui contient Dates, Sales et la table Products. La table Ventes contient les transactions pour chaque jour donné. La table Produits contient des informations sur les informations de vente des produits chaque jour donné. La table Dates ne contient que quelques colonnes pour les besoins de ce didacticiel.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Seule la table Dates nous intéresse, mais nous allons utiliser la table Sales et la table Products pour expliquer comment le contexte de filtre et le contexte de ligne se propagent à l'aide de relations.

Table des matières

Contexte de ligne et contexte de filtre dans une mesure de total cumulé

Créons maintenant une mesure de total cumulé, car elle contient à la fois des contextes de ligne et de filtre. Il s'agit d'une mesure totale courante de base, où j'utilise COUNTROWS sur le FILTER, et la fonction ALL pour renvoyer toutes les années que j'ai dans la table Date. Lorsque j'apporte cette mesure dans le tableau ci-dessous, vous pouvez voir que nous obtenons le résultat que nous attendons.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Essayons maintenant d'analyser le fonctionnement de ce code DAX.

Dans la mesure, vous pouvez voir que nous avons d'abord COUNTROWS, mais ce n'est pas la première fonction qui est évaluée ou exécutée. Ensuite, nous avons la fonction FILTER, puis ALL. La première chose dans l'ordre d'évaluation est de TOUS. ALL renvoie toutes les valeurs uniques du numéro d'année calendaire des dates en ignorant tout contexte de filtre qui existe en dehors de la fonction ALL.

Ainsi, dans les métriques, nous avons la colonne Calendar Year Number, et elle filtre activement cette colonne. Mais puisque ALL va ignorer le contexte de filtre existant, nous allons obtenir toutes les valeurs uniques de cette colonne.

Dans le deuxième argument, dans le contexte de ligne, nous avons écrit que le numéro d'année calendaire des dates doit être inférieur au numéro d'année calendaire des dates MAX. Maintenant, si vous êtes un débutant et que vous essayez toujours de comprendre et d'apprendre DAX, vous pourriez penser que les références sur le côté gauche et à l'intérieur de la fonction MAX appartiennent à la même colonne et sont la même table que nous avons à l'intérieur du Fonction TOUT.

Mais ce n'est pas vrai. La seule partie du contexte de ligne qui appartient à la fonction ALL est celle que nous avons sur le côté gauche. Celui que nous avons sur le MAX est évalué dans un contexte de filtre et non dans le contexte de ligne.

Ainsi, FILTER essaie de créer un contexte de ligne sur la table que vous fournissez dans le premier argument, et cette partie du code est en fait extraite de ce contexte de ligne particulier. Ainsi, chaque ligne, FILTER itère cette table que nous avons à l'intérieur de ALL, puis nous pouvons accéder à toutes les valeurs que nous itérons actuellement.

Ainsi, dans la première itération, nous n'avons qu'une seule valeur. Dans la deuxième itération, nous avons la deuxième valeur. Mais lorsque nous écrivons MAX, cela est indépendant du contexte de ligne que nous créons à l'aide de la fonction FILTER. MAX est donc évalué dans le contexte de filtre créé par le numéro de l'année en cours que nous avons utilisé dans cette matrice.

Lorsque nous sommes en 2006, MAX va retourner 2006 alors que la ligne actuelle peut être 2006, 2007 ou 2008. FILTER va retourner la table qui satisfait les critères que nous spécifions dans le deuxième argument. Lorsque nous passons à 2007, MAX renverra 2007. En 2008, il renverra 2008. Et en fonction de toutes les valeurs inférieures à la valeur renvoyée par la fonction MAX, FILTER renverra un tableau.

Pour prouver que MAX ne dépend pas du contexte de ligne, nous pouvons séparer ce morceau de code DAX en plusieurs variables. Et alors, on pourra comprendre que la référence de la colonne à gauche et à droite ne sont pas les mêmes.

Alors, créons une variable.

Comme vous pouvez le voir dans la mesure ci-dessous, j'ai créé trois variables ( ). J'ai ensuite ajouté le code FILTER en dernier avec une variable Result qui utilise COUNTROWS . Lorsque j'utilise cette mesure dans le tableau ci-dessous, vous verrez que rien ne change. Les résultats sont toujours les mêmes. Nous obtenons toujours le même total cumulé que nous obtenions plus tôt.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Si nous revenons au code et essayons de récupérer la valeur de la première variable et confirmons cela, vous pouvez voir que pour chaque ligne, nous obtenons la même année.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Donc, j'espère avoir pu vous expliquer que la fonction MAX, dans ce code particulier, ne dépend pas réellement du contexte réel pour ses valeurs. Et si vous souhaitez simplifier votre compréhension du contexte d'évaluation, vous pouvez toujours diviser le code en plusieurs variables afin de comprendre l'ordre d'évaluation et la manière dont le code est exécuté.

Maintenant, je veux vous montrer un scénario dans lequel la fonction MAX dépendra du contexte de ligne créé par la fonction FILTER.

Revenons donc à cette mesure. Dupliquons cela, et au lieu de la dernière année visible, j'aurai MAX Dates Calendar Year Number. Lorsque j'apporte cela dans la matrice, vous pouvez voir que nous obtenons un blanc.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Pourquoi?

Le fait est que nous itérons toutes les années et que CALCULATE fait, c'est qu'il convertit la ligne actuellement itérée en un contexte de filtre équivalent.

Si j'écris un signe égal ici, vous pouvez voir que nous obtenons sept, sept et sept.

Pourquoi?

Permettez-moi de créer un nouveau tableau calculé afin que vous puissiez facilement comprendre ce qui se passe.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Je vais créer une nouvelle table. Ensuite, je vais écrire sur le numéro de l'année civile de TOUTES les dates. Ensuite, j'écrirai Max Year, puis j'utiliserai CALCULATE sur le MAX du nombre de dates de l'année civile. Et maintenant vous pouvez voir que pour chaque ligne, nous répétons la même valeur.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Puisque ces nombres ne sont pas strictement inférieurs à eux-mêmes, nous obtenons un blanc. Mais lorsque nous utilisons égal à (=), nous disons que toutes les valeurs inférieures à 2011 obtiennent un sept.

De plus, même si vous utilisez une référence de mesure telle que Max Year, ce code ne fonctionnera pas.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Si je clique sur confirmer, vous pouvez voir que nous n'obtenons toujours rien. En effet, lorsque nous écrivons Max Year, nous écrivons simplement CALCULATE MAX Dates Calendar Year Number.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Une référence de mesure a toujours un CALCULATE à l'extérieur. Ainsi, cette mesure initie une transition de contexte qui convertit la ligne actuellement itérée en un contexte de filtre.

Mais si vous êtes lié et que vous devez utiliser une référence de mesure, vous pouvez stocker cette mesure dans une variable. Et comme vous le savez peut-être, les variables sont constantes et ne peuvent pas créer de transition de contexte. Il ne peut donc pas convertir le contexte de ligne en contexte de filtre.

Il s'agit donc d'une démonstration rapide de la manière dont un contexte de ligne et un contexte de filtre interagissent dans un code DAX.

Passons maintenant à DAX Studio pour comprendre ce qui se passe dans les coulisses.

Utilisation de DAX Studio pour comprendre le contexte de ligne et le contexte de filtre

Allons dans les outils externes et lançons DAX Studio. Nous devons nous connecter au fichier LuckyTemplates à l'aide de Query Plan et de Server Timings .

Ensuite, je vais créer une mesure de requête. J'écrirai DEFINE MEASURE dans le tableau Dates, Dates Running Total. Et puis, je vais utiliser le code original que nous avions.

Puisque nous sommes censés retourner une table, nous pouvons écrire EVALUATE. Enfin, nous allons créer la table en utilisant SUMMARIZECOLUMNS. Donc, nous allons écrire Dates Calendar Year Number, et la colonne virtuelle, qui sera le Running Total. Et puis, je peux écrire quelque chose comme DT comme mot-clé DAX Studio.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Si j'exécute ce code, vous pouvez voir que le code est complet et nous obtenons toujours le même résultat que nous avons vu dans LuckyTemplates.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Passons maintenant au plan de requête pour comprendre ce qui se passe dans les coulisses. Voyons si la fonction MAX dépend réellement du contexte de la ligne ou non. Passons au plan de requête logique car le plan de requête physique est généralement plus complexe et un peu difficile à lire.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Vous pouvez voir que le premier opérateur sur la première ligne est GroupSemiJoin et qu'il est utilisé par SUMMARIZECOLUMNS pour créer un joint interne entre deux colonnes.

Ensuite, pour joindre ces colonnes, il y a Scan_Vertipaq , qui est le moteur de stockage que nous avons à l'intérieur des services d'analyse. Nous pouvons voir qu'il est indiqué que nous avons besoin d'une colonne, qui est Dates Calendar Year Number. Dans LuckyTemplates, vous pouvez voir que sur la matrice, nous avons cette colonne Calendar Year Number, qui sert d'accès à notre rapport.

Ensuite, nous avons la fonction COUNTROWS dans notre mesure en tant qu'opérateur de niveau supérieur, puis COUNTROWS appelle la fonction FILTER pour le filtre. Il y a à nouveau un Scan_Vertipaq , qui indique que RequiredCols est Dates Calendar Year Number.

Les lignes 2 et 5 sont identiques, mais le premier Scan_Vertipaq est marqué d'un zéro tandis que le second est d'un. Cela signifie que la colonne à laquelle nous accédons, à l'aide de la fonction ALL, est extraite séparément de la colonne que nous avons à l'intérieur de la fonction SUMMARIZECOLUMNS.

Ensuite, il y a un opérateur LessThan . Dans la ligne suivante, nous pouvons voir qu'il existe une comparaison entre le contexte de ligne et la fonction MAX .

Ceci est suivi de Max_Vertipaq . Donc, nous extrayons en fait la valeur Max du moteur de stockage. Vers la droite, vous pouvez voir qu'il est écrit, DependOnCols Dates Calendar Year Number. C'est la chose la plus importante dont nous devons nous souvenir. Plus tôt, j'ai dit qu'il n'y a aucune dépendance de la fonction MAX sur le contexte de la ligne, et c'est ce qui le prouve.

Et donc, ici, il est dit zéro.

Où avons-nous trouvé zéro?

En haut (la deuxième ligne), qui est extraite pour SUMMARIZECOLUMNS. Cela signifie que la fonction MAX ne dépend pas du contexte de la ligne, mais dépend en fait de la colonne (numéro de l'année civile) que nous avons à l'intérieur de cette table. Donc, cette table crée en fait le contexte de filtre.

En bref, la fonction MAX dépend du contexte du filtre et non du contexte de la ligne.

Ensuite, vous pouvez voir que pour calculer le Max_Vertipaq, nous avons un Scan_Vertipaq , qui indique que DependOnCols zéro (0) Date Calendar Year Number. Et puis, il y a plusieurs autres colonnes qui nécessitent des colonnes.

Regardons maintenant la version variable du code. Au lieu de renvoyer LastVisibleYear, je vais renvoyer la version COUNTROWS ou la variable Result, et vous pouvez voir que nous obtenons toujours le même résultat.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Si nous regardons le plan de requête, vous pouvez voir qu'il est un peu plus long, mais il est beaucoup plus facile à lire.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Enfin, voici également la version calculée du code

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX

Et voici à quoi ressemble son plan de requête logique.

Contexte de ligne et contexte de filtre dans un code LuckyTemplates DAX


DAX LuckyTemplates : qu'est-ce que le contexte de ligne
Introduction au contexte de filtrage dans LuckyTemplates
Qu'est-ce que la transition de contexte et pourquoi est-ce important ?

Conclusion

Dans ce tutoriel, j'ai expliqué comment une fonction donnée peut interagir et ne peut pas interagir avec le contexte de ligne. Je vous ai également montré comment le MAX, dans ce cas, était évalué dans le contexte du filtre et non dans le contexte de la ligne.

Il est important de toujours se rappeler que le contexte de filtre filtre l'ensemble du modèle et que le contexte de ligne itère uniquement la table donnée et ne filtre jamais le modèle. Le contexte de filtre n'itère pas une table.

J'espère que vous avez trouvé ce tutoriel utile. Restez à l'écoute pour notre code DAX Studio que nous publierons très bientôt. Nous irons beaucoup plus loin dans des scénarios similaires. Nous vous apprendrons également comment optimiser votre code DAX.


Quest-ce que le self en Python ? Exemples concrets

Quest-ce que le self en Python ? Exemples concrets

Qu'est-ce que le self en Python ? Exemples concrets

Comment enregistrer et charger un fichier RDS dans R

Comment enregistrer et charger un fichier RDS dans R

Vous apprendrez à enregistrer et à charger des objets à partir d'un fichier .rds dans R. Ce blog expliquera également comment importer des objets de R vers LuckyTemplates.

First N Business Days Revisited - Une solution de langage de codage DAX

First N Business Days Revisited - Une solution de langage de codage DAX

Dans ce didacticiel sur le langage de codage DAX, découvrez comment utiliser la fonction GENERATE et comment modifier dynamiquement le titre d'une mesure.

Présentez des informations à laide de la technique des visuels dynamiques multi-threads dans LuckyTemplates

Présentez des informations à laide de la technique des visuels dynamiques multi-threads dans LuckyTemplates

Ce didacticiel explique comment utiliser la technique Multi Threaded Dynamic Visuals pour créer des informations à partir de visualisations de données dynamiques dans vos rapports.

Introduction au filtrage du contexte dans LuckyTemplates

Introduction au filtrage du contexte dans LuckyTemplates

Dans cet article, je vais parcourir le contexte du filtre. Le contexte de filtrage est l'un des principaux sujets que tout utilisateur de LuckyTemplates doit d'abord connaître.

Meilleurs conseils pour utiliser les applications dans le service en ligne LuckyTemplates

Meilleurs conseils pour utiliser les applications dans le service en ligne LuckyTemplates

Je souhaite montrer comment le service en ligne LuckyTemplates Apps peut aider à gérer différents rapports et informations générés à partir de diverses sources.

Analyser les changements de marge bénéficiaire au fil du temps - Analytics avec LuckyTemplates et DAX

Analyser les changements de marge bénéficiaire au fil du temps - Analytics avec LuckyTemplates et DAX

Découvrez comment calculer les modifications de votre marge bénéficiaire à l'aide de techniques telles que la création de branches de mesure et la combinaison de formules DAX dans LuckyTemplates.

Idées de matérialisation pour les caches de données dans DAX Studio

Idées de matérialisation pour les caches de données dans DAX Studio

Ce didacticiel abordera les idées de matérialisation des caches de données et comment elles affectent les performances des DAX dans la fourniture de résultats.

Rapports dentreprise à laide de LuckyTemplates

Rapports dentreprise à laide de LuckyTemplates

Si vous utilisez encore Excel jusqu'à présent, c'est le meilleur moment pour commencer à utiliser LuckyTemplates pour vos besoins en matière de rapports commerciaux.

Quest-ce que la passerelle LuckyTemplates ? Tout ce que tu as besoin de savoir

Quest-ce que la passerelle LuckyTemplates ? Tout ce que tu as besoin de savoir

Qu'est-ce que la passerelle LuckyTemplates ? Tout ce que tu as besoin de savoir