Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Le langage DAX
  3. Les principes fondamentaux du DAX
Extrait - Le langage DAX Maîtrisez l'analyse et la modélisation de données dans Power BI et Excel
Extraits du livre
Le langage DAX Maîtrisez l'analyse et la modélisation de données dans Power BI et Excel
8 avis
Revenir à la page d'achat du livre

Les principes fondamentaux du DAX

Introduction

Dans le répertoire des fichiers exemples, vous trouverez les fichiers qui servent de base à ce chapitre :

  • chap3_or.xlsx et chap3_or.pbix, qui correspondent aux fichiers chap2_modèle1.xlsx du chapitre Mise en route.

  • chap3_librairie.xlsx et chap3_librairie.pbix qui correspondent aux fichiers chap2_modèle2_avec_relations.xlsx du chapitre Mise en route.

Pour la plupart de mes présentations, je vais m’appuyer sur le fichier chap3_bambou.pbix, les ventes d’un botaniste en ligne.

À la fin de ce chapitre, vous trouverez un ensemble d’exercices pour mettre en pratique : je vous recommande de prendre le temps de faire les exercices, c’est comme ça que vous progresserez !

Je vous suggère fortement de lire tout le chapitre avant d’entreprendre les exercices, car vous verrez dans les pages qui suivent les bases de tout le travail dans l’un ou l’autre des logiciels. 

Les conventions d’écriture du DAX

Dans cet ouvrage, nous respecterons les conventions suivantes :

  • Les fonctions sont toujours mentionnées en majuscule.

  • Les mesures sont toujours mentionnées entre crochets (voir ci-après pour la définition de la mesure).

  • Les colonnes sont toujours mentionnées entre crochets, précédées du nom de la table d’où elles viennent.

  • Pour Power BI, le séparateur DAX est la virgule (ceci est une option que vous pouvez modifier si vous préférez le séparateur point-virgule).

  • Pour Excel, le séparateur DAX est le point-virgule.

  • Le retour à la ligne est utilisé de manière intensive pour faciliter la lecture de la formule. 

  • La parenthèse fermante est alignée sur le début du nom de la fonction à laquelle elle est associée.

  • Le décalage est obtenu par AltEntrée dans Power BI, et à l’aide de la touche Tab dans Power Pivot.

  • Il est recommandé d’ajouter des commentaires et des remarques : pour cela, faites précéder la ligne de deux tirets (--), de deux slashs (//) ou encadrez un ensemble de lignes avec /* puis */.

Dans cet exemple, [Montant] est une mesure, [Libellé catégorie] est une colonne issue de la table Catégories, CALCULATE est la fonction :

CALCULATE( 
    [Montant], 
    'Catégories'[Libellé catégorie]="Littérature" 
  ) 

En ce qui concerne le nom que vous donnez à vos champs calculés :

  • Il est essentiel d’éviter d’utiliser des lettres accentuées dans les trois ou quatre premiers caractères du nom : en effet, le moteur de DAX qui complète automatiquement la formule (IntelliSense) ne reconnaît pas les accents....

Les mesures et les colonnes

La mesure comme la colonne permettent de créer de nouvelles données à partir des données existantes, à l’aide d’une formule DAX.

Mais la colonne est physiquement stockée dans le fichier, dont la taille est donc augmentée, ce qui n’est pas optimal du point de vue de la performance de l’application. La mesure, elle, n’est calculée qu’au moment de son utilisation, et ne prend pas de place ; elle utilise la puissance du processeur pour ses calculs.

Créer une mesure plutôt qu’une colonne présente donc trois avantages significatifs : la formule n’étant calculée qu’au moment de son utilisation, le temps d’actualisation est plus court, et le poids du fichier n’augmente pas. De plus, si la formule est utilisée dans un visuel filtré (ce qui est le plus souvent le cas), le calcul n’est effectué que pour les lignes résultants du filtrage, et par conséquent pour un ensemble de lignes réduits par rapport à la table (ou les tables) initiale(s).

Il est essentiel pour les utilisateurs d’Excel, d’acquérir le réflexe de créer des mesures plutôt que des colonnes.

Le seul cas où la création d’une colonne est recommandée, c’est celui où la donnée calculée servira à filtrer ou à créer un segment - cela concerne donc quasi-exclusivement des données texte ou date - rarement des données numériques (dans ce cas, la donnée est considérée non agrégative, et elle est traitée comme un code, ou donnée discrète).

Poussons la logique un peu plus loin : la règle est de ne jamais laisser une colonne numérique issue de la source telle quelle, mais...

Le premier script DAX : créer une table du temps avec Power BI

Après les mesures et les colonnes, il y a un troisième type d’entité que vous pouvez créer grâce au DAX : les tables. Et la table du temps en est le meilleur exemple !

Attention, ceci n’est possible que dans Power BI. Pour Power Pivot, il existe une fonctionnalité permettant une construction approchante, nous l’étudierons dans la section suivante.

Une table de dates complète et indépendante des transactions elles-mêmes (date de commande, date de facture, etc.) est un gage de qualité pour le modèle de données. L’idée est notamment de pouvoir référencer toutes les dates, y compris celles où il ne s’est rien passé (une absence de commande est en soi une information).

Cette table est le plus souvent disponible dans une base de données, mais d’autres sources peuvent ne pas en être pourvues.

Dans ce cas, il est essentiel de créer une table du temps solide, qui permettra notamment à Power BI de s’appuyer sur les fonctions Time Intelligence dont nous reparlerons plus loin.

Pour notre modèle1 (les cours de l’or), nous n’allons pas créer cette table, notamment parce que toutes les dates sont présentes et parce que c’est un modèle volontairement simple.

Pour créer une table de dates :

 Dans l’onglet Modélisation, cliquez sur Nouvelle table.

 Dans la barre de formule, copiez puis collez, ou saisissez le script DAX suivant :

Datum = 
VAR DebDate = DATE(2018,1,1) 
VAR FinDate = DATE(2019,12,31) 
RETURN 
ADDCOLUMNS(CALENDAR(DebDate,FinDate), 
           "Annee", FORMAT([Date],"YYYY"), 
           "Trimestre"...

Créer une table de dates avec Power Pivot

Dans Power Pivot, la nécessité de créer une table de dates indépendante reste valable ; en revanche, la démarche n’est pas la même. Elle est à la fois plus simple, et moins souple.

En effet, les colonnes et l’étendue de la table sont déterminées automatiquement.

Je donne cette possibilité à titre informatif, mais vous devriez créer la table du temps en utilisant la démarche, un peu longue, proposée dans les exercices. Il est en effet plus pertinent de récupérer la table à partir d’une autre source, ou de créer la table dans Excel et de l’ajouter au modèle.

 Ouvrez la fenêtre Power Pivot (onglet Power Pivot - Gérer).

 Affichez l’onglet Conception.

 Ouvrez le menu déroulant Table de dates, puis cliquez sur Nouveau.

images/03sob04.png

 Une fois la table créée, utilisez à nouveau le menu déroulant Table de dates et Mettre à jour la plage pour modifier l’étendue si vous le souhaitez.

images/03sob05.png

 Pour finir, affichez l’onglet Accueil et cliquez sur Vue de diagramme.

 Glissez le champ Date de la commande sur le champ Date pour lier les tables.

images/03sob06.png

Découvrez une méthode alternative à l’aide de l’exercice Créer la table du temps avec Excel et Power Pivot à la fin de ce chapitre.

Création de visuels avec Power BI

Afin de pouvoir constater et vérifier le résultat de vos formules DAX, il faut savoir créer quelques visuels simples. Cette section est destinée à vous rappeler, si besoin est, comment créer un tableau, un tableau croisé, une carte et un segment.

Créer un tableau

Il existe différentes manières de créer un visuel : je vous en propose une que j’appliquerai à chaque fois.

Pour créer le tableau :

 Dans la vue Rapport, cliquez sur Table dans le volet Visualisations.

 Cochez ensuite les cases devant les champs que vous souhaitez ajouter au tableau.

 Intervertissez au besoin l’ordre des colonnes dans le puits Valeurs.

images/03sob07.png

Le volet Visualisations, le puits Valeurs et les champs cochés

images/03sob08.png

La table résultant des manipulations

Créer un tableau croisé

L’avantage du tableau croisé est qu’il est très compact, et permet donc de faire figurer beaucoup d’informations sur la page.

 Cliquez sur le visuel Matrice dans le volet Visualisations.

 Dans le volet Champs, cochez ensuite les cases devant les champs que vous souhaitez ajouter.

 Intervertissez au besoin les champs entre le puits Lignes et le puits Colonnes.

images/03sob09.png

La table résultat :

images/03sob10.png

Créer une carte

La carte est un visuel particulier qui permet d’afficher une valeur globale, ou unique.

 Cliquez sur le visuel Carte dans le volet Visualisations.

 Dans le volet Champs, cochez ensuite la case devant la mesure que vous souhaitez ajouter.

images/03sob11.png

La carte obtenue :

images/03sob12.png

Créer un segment

Le segment est un outil visuel permettant de filtrer facilement un ou plusieurs visuels de la page. Lorsque vous voulez tester et valider vos mesures en DAX, il est essentiel de vérifier l’impact du segment sur leurs valeurs.

 Cliquez sur le visuel Segment dans le volet...

Création de visuels avec Excel et Power Pivot

Afin de pouvoir constater et vérifier le résultat de vos formules DAX, il faut les afficher dans un tableau croisé dynamique. Cette section est destinée à vous rappeler, si besoin est, comment créer ce tableau, ainsi qu’un segment, pour filtrer le tableau et vérifier l’impact sur les mesures.

Créer un tableau croisé dynamique

 Cliquez sur l’onglet Insertion dans Excel.

 Cliquez sur le bouton Tableau croisé dynamique (à la gauche du ruban).

images/03sob15.png

 Validez la fenêtre Créer un tableau croisé dynamique.

 Dans le volet Champs de tableau croisé dynamique, glissez les champs de la partie supérieure vers les zones Colonnes, Lignes et Valeurs.

images/03sob16.png

Le tableau croisé obtenu :

images/03sob17.png

Pour réafficher le volet Champs de tableau croisé dynamique, cliquez n’importe où dans le tableau.

Créer une carte (donnée unique)

Pour vérifier la valeur d’une mesure, en tant que donnée isolée, vous pouvez créer un tableau croisé dynamique et ajouter une mesure dans la zone Valeurs, tout simplement :

images/03sob17-b.png

Créer un segment

 Cliquez sur l’onglet Insertion dans Excel.

 Cliquez sur le bouton Segment du groupe Filtres :

images/03sob18.png

 Dans la fenêtre Connexions existantes, affichez l’onglet Modèle de données et double cliquez sur Tables dans le modèle de données de classeur.

 Dans la fenêtre Insérer des segments, cochez la case du champ avec lequel vous souhaitez filtrer, puis validez.

images/03sob19.png

 Attention : pour affecter le segment à un ou plusieurs tableaux, faites un clic droit sur le segment et choisissez le menu Connexions de rapport.

images/03sob20.png
images/03sob21.png

Le segment filtre sur cet exemple sur la catégorie Art

Si vous souhaitez effacer le filtre...

Le contexte de filtre et le contexte de ligne

Les exemples développés dans ce chapitre sont réalisés dans Power BI mais restent intégralement valables dans Power Pivot.

Le contexte d’évaluation, qui regroupe le contexte de filtre et le contexte de ligne, est comme je l’indiquais dans l’introduction, le concept central du DAX. C’est aussi un sujet passionnant !

Dans ce chapitre, je vais donc rappeler les bases, évoquer la propagation du filtre et vous proposer un exemple de formule complexe, que je commenterai au regard de l’évolution du contexte. En effet, comprendre les différents états du contexte dans la formule que vous écrivez est capital.

Le contexte de ligne

Il y a deux types de contextes dans Power BI : le contexte de filtre et le contexte de ligne, qui ont tous deux pour effet de filtrer le résultat du calcul demandé. Les deux contextes peuvent s’appliquer isolément ou simultanément.

Le contexte de ligne existe uniquement lors de la création d’une colonne ou lors de l’utilisation d’une fonction itérative (SUMX, AVERAGEX, COUNTX, etc.., ainsi que la fonction FILTER).

De ce point de vue, il est très pratique, lorsque vous utilisez une fonction, de savoir ou de vérifier si elle est de type itératif, et si elle implique un contexte de ligne. La page www.dax.guide, malgré l’anglais, est à ce titre très utile :

images/03sob22.png

La fonction FILTER est un itérateur qui travaille dans un contexte de ligne (row context)

Lors de la création d’une colonne dans une table de 100 lignes, le calcul sera effectué 100 fois, avec un contexte de ligne différent à chaque fois.

Lors de la création d’une mesure, par exemple dans la formule de la mesure montant :

montant facture = 
SUMX( ...

La fonction CALCULATE

Maintenant que vous avez une bonne compréhension du contexte de filtre (implicite), il est temps d’introduire CALCULATE.

Car en effet, CALCULATE est LA fonction DAX par excellence, dans le sens où elle permet de « jouer » avec le contexte de filtre, en précisant explicitement quel contexte appliquer. 

La syntaxe

Elle est très simple :

CALCULATE ( <Expression> [ , <Filtre1> ] [ , <Filtre2> ] [ , ...]) 

Vous pouvez ajouter autant de filtres que vous le souhaitez. Les filtres sont tous traités simultanément (l’ordre des filtres n’a donc aucune importance).

Voici un exemple de syntaxe de CALCULATE :

CALCULATE( 
    [qté] , 
    produits[couleur] = "Pourpre" 
) 

Enfin, notons que la performance de cette syntaxe tient au fait que CALCULATE procède d’abord en modifiant le contexte de filtre, propageant ainsi le filtre dans le modèle, et ensuite seulement calcule l’expression : le nombre de calculs requis est donc réduit.

Les trois façons de modifier le contexte de filtre (remplacer, ajouter, supprimer)

Prenons comme base le visuel suivant. Aucun segment ou autre visuel ne le filtre. Le contexte de filtre est donc défini exclusivement par la colonne couleur :

images/03sob34.png

Rappel : ici, la mesure montant facture est définie par la formule :

montant facture = 
SUMX( 
    transactions , 
    [qté] * RELATED(produits[prix unitaire]) 
) 

CALCULATE peut opérer trois interventions :

  • Remplacer le contexte de filtre : lorsque le filtre explicite donné comme argument de CALCULATE porte sur la même colonne que celle qui définit le contexte implicite (celui que génère le rapport), CALCULATE...

L’éditeur de DAX de Power BI

Attention, cette section ne concerne que Power BI.

L’éditeur de formule fourmille de raccourcis-clavier permettant d’accélérer la saisie ou de faciliter la correction des formules DAX.

Avec un minimum de pratique, vous gagnerez un temps précieux pour remettre en forme, corriger à plusieurs endroits en même temps, intervertir les lignes, etc.

Voici quelques-uns de ces raccourcis.

Les cinq raccourcis-clavier les plus utiles :

  • Sélectionner toutes les occurrences du terme (ou des caractères) actuellement sélectionné (ex : une colonne, une table ou une fonction qu’il faut remplacer partout dans la formule) : CtrlF2 (ou CtrlShift L)

  • Mettre en commentaire (ou à l’inverse, enlever la mise en commentaire) : sélectionner la ou les lignes et Ctrl /

  • Aller à la ligne avec indentation (retrait) : ShiftEntrée

  • Copier une ligne au-dessus/en dessous: ShiftAltFlèche en haut ou Flèche en bas

  • Valider une proposition de fonction d’IntelliSense : Tab

Manipuler les lignes :

  • Déplacer une ligne vers le haut/le bas : AltFlèche en haut/Flèche en bas

  • Insérer la ligne ci-dessous : CtrlEntrée

  • Insérer la ligne ci-dessus : CtrlShiftEntrée

  • Sélectionner la ligne actuelle : Ctrl I

  • Naviguer jusqu’à une ligne en indiquant son numéro : Ctrl G (tapez ensuite Entrée pour masquer la zone de saisie du numéro de ligne)

Saisir du texte :

  • Insérer plusieurs curseurs aux endroits choisis en cliquant, utile pour saisir un même texte à plusieurs endroits : Alt clic

  • Activer plusieurs curseurs au même endroit sur plusieurs lignes : CtrlAltFlèche en bas ou CtrlAltFlèche en haut

  • Sélectionner toutes les occurrences...

Exercices

Pour cet ensemble d’exercices, utilisez les fichiers chap3_librairie.pbix (ou chap3_librairie.xlsx) et chap3_or.pbix (ou chap3_or.xlsx).

Les mesures, les colonnes

La création des mesures explicites est vraiment la base du travail, c’est la raison pour laquelle nous commencerons par ce point.

Créer des mesures dans le fichier librairie

Dans le fichier chap3_librairie.pbix ou chap3_librairie.xlsx, il s’agit de créer les deux mesures explicites requises, à savoir les quantités, que vous nommerez qté, et le montant de la ligne de commandes, produit de la quantité et du prix de vente (colonne PV). Vous nommerez cette mesure montant.

Une fois les mesures créées, pensez à les formater (nombre entier pour qté, nombre avec 2 décimales pour montant), et à masquer les colonnes initiales.

Créer des mesures dans le fichier or

Dans le fichier chap3_or.pbix ou chap3_or.xlsx, il s’agit de créer une seule mesure explicite, à savoir le volume des échanges, que vous nommerez vol.

Le cours de clôture, dans la colonne Clôture, est une donnée délicate à traiter : en effet, comment l’agréger ? Lorsque l’on regarde au niveau mensuel, la somme des volumes fait sens, mais pour le cours ? La seule option pertinente, c’est le cours de clôture le dernier jour du mois. Cette mesure est trop complexe à ce niveau. Pour l’instant, laissons donc cette donnée telle quelle.

Créer la table du temps avec Power BI

Dans le fichier chap3_librairie.pbix, créez la table du temps et déroulez le processus pour obtenir un modèle prêt à être utilisé.

Créer la table du temps avec Excel et Power Pivot

Pour créer la table de temps dans le fichier chap3_librairie.xlsx, nous allons privilégier...

Corrigés

Les mesures, les colonnes

Créer des mesures dans le fichier librairie

 Créez la mesure qté qui est simplement la somme de la colonne quantité :

qté = SUM('Détail des commandes'[Quantité]) 

C’est la plus basique des mesures, mais elle est très courante. Dans de rares cas, ce n’est pas la somme qui est utilisée mais la moyenne (AVERAGE), le minimum (MIN) ou le maximum (MAX).

montant fait appel à deux colonnes, il faut donc recourir à SUMX :

 Créez la mesure suivante :

montant = 
SUMX( 
    'Détail des commandes' , 
    'Détail des commandes'[Quantité] 
    * 'Détail des commandes'[PV] 
) 

Attention, dans Power Pivot (Excel), pensez à changer la virgule en point-virgule.

Créer des mesures dans le fichier or

 Créez la mesure vol qui est simplement la somme de la colonne volume :

vol = SUM(CoursOr[Volume]) 

 En ce qui concerne le format de cette mesure, activez le séparateur de milliers pour mieux lire le chiffre (élevé). Il s’agit du bouton images/03sob38a.png dans Power BI et de l’option Utilisez le séparateur de milliers() dans Power Pivot.

images/03sob38.png
images/03sob39.png

Créer la table du temps avec Power BI

Ici, pas de correction en particulier, il suffit de bien suivre la démarche proposée dans la partie théorique.

Attention à bien modifier les dates de début et de fin au besoin, à marquer la table comme table de dates, à la relier au reste du modèle et à masquer la colonne Date de la commande.

Créer la table du temps avec Excel et Power Pivot

La démarche décrite pas à pas dans la partie exercices peut paraître lourde, mais elle est finalement facile à...