Article Microsoft
DAX
Data Analysis Expression
Rédigé par Julien Larcher – Technical Executive Associate
DAX pour « Data Analysis Expression » est un langage de programmation utilisé dans Microsoft Power BI pour créer des colonnes, des mesures ou encore des tables calculées grâce à ses nombreuses fonctions. Bref il s’agit là d’un bon moyen pour enrichir votre modèle de données. Si je vous ai perdu dès la première ligne de cet article en évoquant « langage de programmation », n’ayez crainte, cet article a pour objectif de démystifier ce langage et de vous apporter, je l’espère, quelques réponses !
Quelques définitions
pour commencer
Colonne calculée
Ajout d’une colonne dans une table. La donnée est ajoutée (calculée) une seule fois, au moment du chargement des données (ou de l’actualisation). La colonne calculée va créer une valeur pour chaque ligne de la table. La colonne est physiquement stockée dans le modèle de données, et a donc un impact (parfois non négligeable) sur la taille du fichier.
Mesure calculée
Ajout d’une mesure, d’un indicateur dans une table. La donnée est calculée à la demande. Au moment où on l’ajoute à un visuel, ou encore quand on change la valeur d’un filtre. Il faut bien avoir en tête que les mesures sont calculées en fonction des filtres utilisés dans le rapport. L’ensemble de ces filtres représentent le contexte. A la différence de la colonne, la mesure ne prend donc pas de place dans le modèle de données. La mesure utilise principalement les ressources du processeur pour effectuer les calculs.
Table calculée
Ajout d’une table à notre modèle de données. En plus de récupérer des tables à partir de sources de données diverses, vous pouvez, à l’aide de DAX, créer des tables. Le meilleur exemple pour cette notion, est la table « calendrier » que nous pouvons entièrement créer en DAX. Il existe des fonctions DAX spécifiques pour la création de tables (DISTINCT, VALUES, CALENDAR …)
Les fonctions DAX
Composent le langage DAX. Ces fonctions sont classées dans différentes catégories. Il y a des fonctions d’agrégations(SUM, AVERAGE …), des fonctions de date et heures (DATEDIFF, DATEVALUE ..) ou encore des fonctions de filtres (ALL, ALLEXCEPT …). Cet article n’a pas pour vocation de lister toutes les fonctions DAX existantes, il existe de nombreux site pour cela.
Le contexte d’évaluation
L’une des notions les plus importantes à comprendre pour maitriser le DAX ! Le contexte d’évaluation représente l’ensemble des filtres appliqués aux données. Une formule DAX est toujours exécutée dans un contexte et il existe deux types de contexte :
Contexte de filtre (segment, filtre de page, de visuel, ligne ou encore colonne)
Contexte de ligne, il s’agit de la ligne courante lors de l’évaluation d’une expression (colonne calculée par exemple)
Nous allons justement détailler ici ces différents contextes pour vous donner le maximum d’information pour comprendre les clés du langage DAX !
Le contexte de ligne
Rien de tel, qu’un bon exemple pour comprendre ! Le contexte de ligne représente la ligne courante lors de l’évaluation d’une formule.
La table ci-dessous représente une table des ventes qui contient un identifiant de vente (Sale Key), une quantité, un prix unitaire et une taxe.
Si je veux rajouter le montant des ventes associée à ma ligne de vente dans cette table, je dois créer une colonne calculée.
Dans cet exemple on voit bien que le calcul est fait pour chaque ligne de notre table. En créant une colonne calculée, DAX interprète par défaut la formule ligne par ligne.
Si nous essayons cette même formule, non plus dans une colonne mais dans une mesure, nous obtiendrons un message d’erreur, car la mesure ne connait pas, par défaut, le contexte de ligne à utiliser. Il faudra utiliser des fonctions d’agrégation (SUM) ou encore des fonctions d’itération comme SUMX pour bien définir le contexte de ligne que la formule doit utiliser.
Le contexte de filtre
Représente l’ensemble des filtres appliqués sur les données AVANT l’évaluation de la formule DAX.
Dans Power BI la notion de filtre représente tout élément permettant la segmentation des données, comme :
Segment (slicer)
Filtre de page, de visuel … (bandeau de filtre)
Ligne et colonne dans une matrice
Ligne dans une table
Axe X et/ ou Axe Y dans un graphique
Dans l’exemple ci-dessus, la valeur 1 720 170,00 vient de notre mesure :
Total Sales := SUM( ‘Fact Sale'[Total Including Tax] )
Cette mesure est simplement une somme de notre montant des ventes. Le fait qu’on ait une valeur différente dans chaque cellule vient justement de notre contexte de filtre. Ici les données sont filtrées sur la couleur « Light Brown » et l’année 2019
En utilisant les couleurs en ligne et les années en colonne, les données de la matrice sont filtrées et le résultat de notre mesure se retrouve à l’intersection des 2 éléments.
Il est vrai qu’avec cette multitude de filtre, on peut vite être perdu dans notre visuel et ne plus savoir quels sont les filtres appliqués … mais c’est sans compter sur l’aide de Power BI avec l’entête du visuel qui propose une fonctionnalité permettant de voir quels sont les filtres ou segments actuellement appliqués sur le visuel.
La fonction Calculate
Dans cet article nous ne détaillerons pas toutes les fonctions DAX, mais l’une d’entre elle mérite toute notre attention, la fonction Calculate !
Cette fonction va être utilisée, justement pour modifier le contexte d’exécution d’une formule DAX.
Reprenons notre exemple :
Dans cette matrice nous utilisons 2 mesures :
Total Sales = SUM ( ‘Fact Sale'[Total Including Tax] )
Cette mesure est calculée grâce aux filtres de lignes et de colonnes qu’on a dans la matrice.
Total Sales All Selected Colors = CALCULATE( ‘Fact Sale'[Total Sales] ,
ALLSELECTED( ‘Dimension Stock Item'[Color] ) )
Dans cette mesure on modifie le contexte d’exécution en utilisant la fonction CALCULATE et ALLSELECTED. Ainsi on obtient le montant des ventes toutes couleurs confondus et tout en conservant le filtre sur l’année. Ce qui peut nous permettre de faire un ratio par exemple, pour avoir le poids d’une couleur d’article dans les ventes sur une année particulière.
Ce qu’il faut retenir ici, c’est que la fonction CALCULATE doit être utilisée dés lors que nous souhaitons modifier le contexte d’exécution d’une formule DAX.
Utiliser les bonnes relations
Une autre fonctions DAX mérite d’être sous les feux des projecteurs, la fonction USERELATIONSHIP.
Dans un modèle de données Power BI qui contient deux tables, par exemple :
Cas classique de la table de fait qui contient plusieurs dates et d’une table de calendrier.
Dans cet exemple nous avons deux relations existantes entre la table de fait FactSale et la table Calendrier, mais seul 1 relation est active. Cela signifie que toutes les analyses qui feront appel à une notion de temps, utiliseront par défaut la date de facturation.
Ce graphique nous montre l’évolution des ventes par mois de la date de facturation. Nous utilisons bien la table calendrier et notre mesure Total Sales. Par défaut cette mesure va utiliser la relation active qui est sur la date de facturation.
Si notre analyse doit porter sur la date de livraison et non pas sur la date de facturation, nous devons utiliser la fonction USERELATIONSHIP pour « activer » la bonne relation et ainsi indiquer à Power BI d’effectuer son calcul avec la date de livraison :
Total Sales By DeliveryDate = CALCULATE( ‘Fact Sale'[Total Sales] ,
USERELATIONSHIP( ‘Calendar'[Date],’Fact Sale'[Delivery Date Key] ) )
On retrouve dans cette mesure notre fonction CALCULATE, car nous modifions le contexte du calcul avec la fonction USERELATIONSHIP.