Découvrir DAX
En bref
- Objectifs : lire et écrire une formule DAX ; distinguer colonne calculée, mesure et table calculée ; créer des mesures explicites et les ranger dans une table de mesures.
- Prérequis : partie 3 « Modéliser » (tables, relations, schéma en étoile).
- Niveau : découverte.
Pourquoi ?
Glisser une colonne numérique dans un visuel suffit pour obtenir une somme, mais les vraies questions métier vont plus loin : panier moyen, taux de marge, évolution par rapport à l'an dernier, part d'un produit dans sa catégorie. Ces calculs s'écrivent en DAX (Data Analysis Expressions), le langage de formules du modèle sémantique, partagé par Power BI, Analysis Services et Power Pivot dans Excel. Une fois écrits dans le modèle, ils sont réutilisables dans tous les visuels et dans tous les rapports connectés au modèle.
Notions clés
La syntaxe d'une formule
Une formule DAX commence toujours par un nom, suivi du signe égal et d'une expression :
Montant vente = SUM ( Ventes[Montant] )Montant venteest le nom de la mesure ;SUMest la fonction, ses arguments sont entre parenthèses ;Ventes[Montant]est une référence de colonne entièrement qualifiée : la table, puis la colonne entre crochets ;- un nom de table qui contient des espaces ou des caractères spéciaux s'écrit entre apostrophes :
'Ventes 2025'[Montant]; - une mesure se référence par son seul nom entre crochets, sans table :
[Montant vente].
Bonne pratique : qualifiez toujours les colonnes (Ventes[Montant]) et jamais les mesures ([Montant vente]). Vous distinguez ainsi d'un coup d'œil une colonne d'une mesure.
Les opérateurs les plus utilisés sont + - * / pour le calcul, & pour concaténer du texte, && (et), || (ou) et IN pour les conditions. Les commentaires s'écrivent après // ou -- sur une ligne, ou entre /* et */ sur plusieurs lignes.
Colonne calculée, mesure ou table calculée ?
| Point | Colonne calculée | Mesure | Table calculée |
| Calculée | À l'actualisation, une valeur par ligne | Au moment de l'affichage, pour chaque cellule du visuel | À l'actualisation, une table entière |
| Contexte | Contexte de ligne (la ligne en cours) | Contexte de filtre (filtres du visuel, des segments, du volet Filtres) | Aucun filtre du rapport |
| Stockage | Stockée dans le modèle, occupe de la mémoire | Non stockée, seule la formule est enregistrée | Stockée dans le modèle |
| Réagit aux segments | Non, la valeur est figée | Oui | Non, la table est figée |
| Usage type | Classer, regrouper, filtrer, relier (axe d'un visuel, segment, clé de relation) | Agréger : sommes, ratios, comparaisons, classements | Calendrier, paramètres, tables de synthèse |
Exemple de colonne calculée dans la table Ventes, qui calcule le délai de livraison de chaque ligne :
Délai (jours) = DATEDIFF ( Ventes[Date], Ventes[DateLivraison], DAY )Exemple de colonne calculée qui lit une valeur de la table liée, côté « un » de la relation (voir « DAX et relations ») :
Couleur (RELATED) = RELATED ( Produit[Couleur] )Exemple de table calculée : le calendrier des PBIP de démonstration (voir « Fonctions de table ») :
Calendrier =
ADDCOLUMNS (
CALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) ),
"Annee", YEAR ( [Date] ),
"NumMois", MONTH ( [Date] ),
"Mois", FORMAT ( [Date], "mmmm" )
)Règle de choix : si le résultat doit changer quand l'utilisateur filtre, écrivez une mesure. Si vous avez besoin de la valeur dans un axe, un segment ou une relation, écrivez une colonne, de préférence dans Power Query plutôt qu'en DAX (principe de Roche, voir « Optimiser le modèle »).
Mesures implicites et mesures explicites
Une mesure DAX est une expression évaluée dans le contexte d'analyse : lignes et colonnes du visuel, segments, filtres. Elle s'adapte donc aux interactions de l'utilisateur.
| Point | Mesure implicite | Mesure explicite |
| Définition | Créée automatiquement quand vous glissez une colonne numérique dans un visuel (« Somme de Montant ») | Écrite par vous en DAX |
| Réutilisation | Limitée au visuel ; un renommage ne vaut que pour ce visuel | Réutilisable dans tous les visuels et rapports ; renommée une fois pour toutes |
| Logique de calcul | Agrégation simple (somme, moyenne, nombre...) | Toute la logique métier : filtres, ratios, comparaisons dans le temps |
| Référence dans une formule | Impossible : une autre mesure ne peut pas l'utiliser | Possible : [Montant vente] se réutilise dans CALCULATE, DIVIDE, etc. |
| Documentation | Aucune | Nom explicite, description, commentaires, dossier d'affichage |
Privilégiez les mesures explicites, même pour une simple somme :
- réutilisabilité : la même mesure alimente tous les visuels, tableaux croisés et cartes ;
- maîtrise du calcul : vous décidez de la logique métier, du contexte d'évaluation et des exceptions ;
- lisibilité : « Montant vente » est plus clair que « Somme de Montant » ;
- maintenance : une correction dans la mesure se répercute partout.
Exemples courants de mesures
Montant vente = SUM ( Ventes[Montant] )
Nb ventes = COUNTROWS ( Ventes )
Panier moyen = DIVIDE ( [Montant vente], [Nb ventes] )
Montant France = CALCULATE ( [Montant vente], Geographie[Pays] = "France" )
Montant N-1 = CALCULATE ( [Montant vente], SAMEPERIODLASTYEAR ( Calendrier[Date] ) )
% évolution N-1 = DIVIDE ( [Montant vente] - [Montant N-1], [Montant N-1] )DIVIDE remplace l'opérateur / dès que le dénominateur peut être nul ou vide : elle renvoie une valeur vide (BLANK) au lieu d'une erreur. Une mesure vide fait disparaître la ligne correspondante dans un visuel.
Pas à pas
Créer une mesure
1. Dans le volet Données, faites un clic droit sur la table Ventes, puis choisissez Nouvelle mesure.
[Capture : volet Données, clic droit sur la table Ventes, menu contextuel avec Nouvelle mesure en surbrillance]
2. Dans la barre de formule, saisissez la formule, puis validez avec Entrée ou la coche :
Montant vente = SUM ( Ventes[Montant] )[Capture : barre de formule avec la mesure Montant vente, et l'icône de calculatrice de la mesure dans le volet Données]
3. Dans l'onglet Outils de mesure, choisissez le format (nombre décimal, séparateur de milliers, devise) et, si besoin, un dossier d'affichage dans le volet Propriétés de la vue Modèle.
Créer une table de mesures
Une table de mesures regroupe toutes les mesures en tête du volet Données, au lieu de les disperser dans les tables de faits.
1. Dans l'onglet Accueil, choisissez Entrer des données.
2. Nommez la table, par exemple Mesures (ou Calculs), puis cliquez sur Charger.
3. Dans la vue Modèle, faites glisser au moins une mesure dans la table Mesures (ou modifiez sa table d'accueil dans le ruban Outils de mesure).
4. Supprimez la colonne Colonne 1 de la table Mesures. La table remonte en première position et son icône devient une calculatrice.
[Capture : volet Données avec la table Mesures en tête de liste, icône de calculatrice, et ses dossiers d'affichage]
Méthode alternative : créez une table calculée (Modélisation > Nouvelle table) avec la seule formule ci-dessous, déplacez-y au moins une mesure, puis masquez la colonne Value. Avec cette méthode, l'icône de la table ne change pas.
Mesures = { 1 }Exemple
Le PBIP de démonstration FonctionsFiltre contient une mesure de base et ses variantes, rangées par dossier d'affichage (0. Base, 1. CALCULATE...). Ouvrez-le pour observer l'organisation des mesures et leurs descriptions (lignes /// au-dessus de chaque mesure dans la vue TMDL).
[Capture : volet Données du PBIP FonctionsFiltre, table Ventes dépliée avec les dossiers d'affichage 0. Base à 9. SELECTEDVALUE]
Pièges et bonnes pratiques
- Créez toujours des mesures explicites, même pour une somme simple.
- Donnez des noms clairs, compréhensibles par les utilisateurs du rapport : ils les verront dans les visuels.
- Documentez les mesures complexes : commentaires dans le code et description dans le volet Propriétés (elle s'affiche au survol dans le volet Données).
- Structurez les mesures par dossier d'affichage, par thème (ventes, marge, temps...).
- Validez les résultats sur des cas de test : un total connu, une ligne témoin, un segment.
- Évitez les colonnes calculées pour ce qu'une mesure sait faire : elles alourdissent le modèle et ne réagissent pas aux filtres.
À retenir
- Une formule DAX :
Nom = expression, colonnes qualifiéesTable[Colonne], mesures entre crochets[Mesure]. - Colonne calculée : une valeur par ligne, calculée à l'actualisation. Mesure : un résultat par cellule, calculé à l'affichage.
- Une mesure explicite est réutilisable, documentable et référençable dans d'autres mesures ; une mesure implicite ne l'est pas.
- DIVIDE protège des divisions par zéro et renvoie une valeur vide.
- Une table de mesures et des dossiers d'affichage rendent le modèle lisible.
Pour aller plus loin
- Source (Microsoft Learn, principes fondamentaux de DAX)
- Source (Microsoft Learn, mesures)
- Source (Microsoft Learn, colonnes calculées)
- Source (Microsoft Learn, tables calculées)
- Source (Microsoft Learn, DIVIDE ou opérateur de division)
- Source (SQLBI)
Exercice
Mise en pratique DAX, thème 1 | Mesures de base et ratios : chiffre d'affaires, commandes, panier moyen, marge et taux de remise.