Aide-mémoire Power BI
Dernière mise à jour
Mesures, colonnes et tables
Une mesure est calculée pour chaque cellule d'un visuel ; une colonne calculée est calculée une fois par ligne et stockée.
| À quoi ça sert | DAX |
|---|---|
| Créer une mesure | Total Sales = SUM ( Sales[Amount] ) |
| Créer une colonne calculée (une valeur par ligne) | Line Total = Sales[Quantity] * Sales[Unit Price] |
| Créer une table calculée | Top Customers = TOPN ( 10, Customer, [Total Sales] ) |
| Faire référence à une colonne : le nom de la table, puis la colonne entre crochets | Sales[Amount] |
| Mettre entre apostrophes un nom de table qui contient un espace ou qui est un mot réservé | 'Date'[Date] |
| Faire référence à une mesure : crochets seulement | [Total Sales] |
| Utiliser une mesure dans une autre mesure | Average Price = DIVIDE ( [Total Sales], [Total Units] ) |
Fonctions d'agrégation
Chacune résume une colonne dans le contexte de filtre actuel.
| À quoi ça sert | DAX |
|---|---|
| Additionner une colonne | SUM ( Sales[Amount] ) |
| Moyenne d'une colonne | AVERAGE ( Sales[Amount] ) |
| Plus petite valeur | MIN ( Sales[Order Date] ) |
| Plus grande valeur | MAX ( Sales[Order Date] ) |
| Compter les lignes d'une table | COUNTROWS ( Sales ) |
| Compter les valeurs non vides d'une colonne | COUNT ( Sales[Amount] ) |
| Compter les valeurs distinctes | DISTINCTCOUNT ( Sales[Customer Key] ) |
| Diviser sans risque : une valeur vide au lieu d'une erreur quand le diviseur vaut 0 | DIVIDE ( [Total Sales], [Total Units] ) |
| Diviser avec une valeur à afficher quand le diviseur vaut 0 | DIVIDE ( [Profit], [Total Sales], 0 ) |
Itérateurs (les fonctions X)
Ils parcourent une table ligne par ligne, évaluent une expression pour chaque ligne, puis agrègent les résultats.
| À quoi ça sert | DAX |
|---|---|
| Multiplier par ligne, puis additionner | SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| Moyenne d'un résultat par ligne | AVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| Plus grand résultat par ligne | MAXX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| Moyenne d'une mesure par client | AVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] ) |
| Utiliser une colonne d'une table liée dans l'expression | SUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) ) |
| Compter les lignes qui remplissent une condition | COUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) ) |
| Classer chaque produit selon une mesure | RANKX ( ALL ( Product[Product] ), [Total Sales] ) |
| Classer sans trou après les ex aequo (1, 1, 2) | RANKX ( ALL ( Product[Product] ), [Total Sales], , DESC, DENSE ) |
| Réunir des valeurs dans un seul texte | CONCATENATEX ( VALUES ( Product[Category] ), Product[Category], ", " ) |
CALCULATE et fonctions de filtre
CALCULATE évalue une expression avec des filtres modifiés. Un filtre sur la même colonne remplace l'ancien ; des filtres sur des colonnes différentes se combinent avec AND.
| À quoi ça sert | DAX |
|---|---|
| Filtrer sur une valeur | CALCULATE ( [Total Sales], Product[Category] = "Bikes" ) |
| Filtrer sur une liste de valeurs | CALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } ) |
| Deux filtres (AND) | CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" ) |
| OR sur deux colonnes | CALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) ) |
| Filtrer selon une mesure | CALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| Garder le filtre existant et faire l'intersection avec lui | CALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) ) |
| Supprimer les filtres d'une colonne | CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) |
| Supprimer tous les filtres d'une table | CALCULATE ( [Total Sales], ALL ( Product ) ) |
| Supprimer tous les filtres d'une table sauf certaines colonnes | CALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) ) |
| Garder la sélection des segments, ignorer les lignes du visuel lui-même | CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) |
| Utiliser une relation inactive | CALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) ) |
| Faire passer un filtre dans les deux sens pour une mesure | CALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) ) |
| Filtrer par une table sans relation | CALCULATE ( [Total Sales], TREATAS ( VALUES ( Budget[Category] ), Product[Category] ) ) |
Time Intelligence
Ces fonctions ont besoin d'une table de dates : une ligne par jour, sans trous, marquée comme table de dates.
| À quoi ça sert | DAX |
|---|---|
| Cumul depuis le début de l'année | TOTALYTD ( [Total Sales], 'Date'[Date] ) |
| Cumul depuis le début de l'année, exercice fiscal clos le 30 juin | TOTALYTD ( [Total Sales], 'Date'[Date], "6/30" ) |
| Cumul depuis le début de l'année dans CALCULATE | CALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) ) |
| Cumul depuis le début du trimestre | TOTALQTD ( [Total Sales], 'Date'[Date] ) |
| Cumul depuis le début du mois | TOTALMTD ( [Total Sales], 'Date'[Date] ) |
| Même période l'année précédente | CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) |
| Décaler les dates d'un intervalle (ici, un mois en arrière) | CALCULATE ( [Total Sales], DATEADD ( 'Date'[Date], -1, MONTH ) ) |
| Le mois précédent entier | CALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) ) |
| La période entière un an plus tôt | CALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) ) |
| Les 12 derniers mois jusqu'à la dernière date visible | CALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) ) |
| Une plage de dates fixe | CALCULATE ( [Total Sales], DATESBETWEEN ( 'Date'[Date], DATE ( 2025, 1, 1 ), DATE ( 2025, 3, 31 ) ) ) |
Modèles de mesures courants
Copiez-les, puis renommez les tables et les colonnes selon votre modèle.
| À quoi ça sert | DAX |
|---|---|
| Pourcentage de toutes les catégories | Category % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) ) |
| Pourcentage de ce que laissent les segments | Visible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) ) |
| Croissance d'une année sur l'autre | YoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear ) |
| Cumul sur toute la période | Running Total = CALCULATE ( [Total Sales], FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] <= MAX ( 'Date'[Date] ) ) ) |
| Moyenne mobile sur 7 jours (par jour avec des ventes) | Sales 7 Day Avg = AVERAGEX ( DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -7, DAY ), [Total Sales] ) |
| Afficher une valeur seulement pour le top 5 | Top 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] ) |
| Compter les clients au-dessus d'un seuil | Big Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| Faire en sorte qu'un total additionne ses lignes | Bonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] ) |
| Afficher une valeur à un seul niveau d'une matrice | Category Rank = IF ( ISINSCOPE ( Product[Category] ), RANKX ( ALL ( Product[Category] ), [Total Sales] ) ) |
| Solde de clôture : la dernière date qui a une valeur | Closing Units = CALCULATE ( SUM ( Inventory[Units] ), LASTNONBLANK ( 'Date'[Date], CALCULATE ( SUM ( Inventory[Units] ) ) ) ) |
Fonctions logiques et d'information
Pour les conditions, et pour savoir ce que contient le contexte de filtre.
| À quoi ça sert | DAX |
|---|---|
| Une condition | IF ( [Total Sales] > 1000, "High", "Low" ) |
| Plusieurs valeurs d'une expression | SWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" ) |
| Des tranches, testées de haut en bas | SWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" ) |
| AND et OR | IF ( Sales[Quantity] > 2 && Sales[Amount] > 50, "Big", "Small" ) |
| La valeur est-elle vide ? | ISBLANK ( [Total Sales] ) |
| Première valeur non vide | COALESCE ( [Total Sales], 0 ) |
| Le filtre laisse-t-il exactement une valeur ? | HASONEVALUE ( Product[Category] ) |
| Cette valeur unique, ou une valeur par défaut | SELECTEDVALUE ( Product[Category], "All categories" ) |
| Cette ligne du visuel est-elle regroupée par la colonne ? | ISINSCOPE ( Product[Category] ) |
| Renvoyer une valeur vide | BLANK () |
Fonctions de texte
L'opérateur & concatène du texte ; FORMAT transforme un nombre ou une date en texte.
| À quoi ça sert | DAX |
|---|---|
| Concaténer du texte | Customer[First Name] & " " & Customer[Last Name] |
| Mettre en forme un nombre | FORMAT ( [Total Sales], "#,0.00" ) |
| Mettre en forme une date | FORMAT ( 'Date'[Date], "mmm yyyy" ) |
| Premiers caractères | LEFT ( Product[Code], 3 ) |
| Caractères à partir d'une position | MID ( Product[Code], 4, 2 ) |
| Longueur | LEN ( Product[Name] ) |
| Majuscules | UPPER ( Store[City] ) |
| Supprimer les espaces en trop | TRIM ( Customer[Name] ) |
| Remplacer du texte | SUBSTITUTE ( Customer[Phone], " ", "" ) |
| Position d'un texte, sans tenir compte de la casse (0 s'il est absent) | SEARCH ( "pro", Product[Name], 1, 0 ) |
Fonctions de date
Les dates sont des nombres en interne : vous pouvez les soustraire pour obtenir des jours.
| À quoi ça sert | DAX |
|---|---|
| La date du jour | TODAY () |
| Construire une date | DATE ( 2025, 12, 31 ) |
| Année d'une date | YEAR ( 'Date'[Date] ) |
| Numéro du mois | MONTH ( 'Date'[Date] ) |
| Jour de la semaine, lundi valant 1 | WEEKDAY ( 'Date'[Date], 2 ) |
| Numéro de semaine, semaines commençant le lundi | WEEKNUM ( 'Date'[Date], 2 ) |
| Dernier jour du mois | EOMONTH ( 'Date'[Date], 0 ) |
| Même jour un mois plus tôt | EDATE ( 'Date'[Date], -1 ) |
| Nombre de jours entre deux dates | DATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY ) |
| Une table de dates à partir de dates fixes | CALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) ) |
| Une table de dates à partir des dates du modèle | CALENDARAUTO () |
Relations et recherches
RELATED suit une relation du côté plusieurs vers le côté un.
| À quoi ça sert | DAX |
|---|---|
| Valeur du côté un (dans une colonne de Sales) | RELATED ( Product[Category] ) |
| Les lignes du côté plusieurs pour la ligne actuelle (dans une colonne de Customer) | COUNTROWS ( RELATEDTABLE ( Sales ) ) |
| Rechercher une valeur sans relation | LOOKUPVALUE ( Product[Price], Product[SKU], Sales[SKU] ) |
| Chemin parent enfant (pour les hiérarchies et la sécurité au niveau des lignes) | PATH ( Employee[Employee ID], Employee[Manager ID] ) |
| L'utilisateur connecté, pour la sécurité dynamique au niveau des lignes | USERPRINCIPALNAME () |
Fonctions de table
Elles renvoient des tables : utilisez-les dans une table calculée, dans CALCULATE ou dans un itérateur.
| À quoi ça sert | DAX |
|---|---|
| Valeurs distinctes dans le filtre actuel | VALUES ( Product[Category] ) |
| Lignes qui remplissent une condition | FILTER ( Product, Product[Price] > 100 ) |
| Les N premières lignes selon une mesure | TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) |
| Regrouper par colonnes et ajouter des mesures | SUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] ) |
| Ajouter une colonne à une table | ADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] ) |
| Choisir et renommer des colonnes | SELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] ) |
| Une liste de nombres | GENERATESERIES ( 1, 10, 1 ) |
| Toutes les combinaisons de deux tables | CROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) ) |
| Empiler deux tables qui ont les mêmes colonnes | UNION ( 'Sales 2024', 'Sales 2025' ) |
Variables
VAR nomme une étape et la calcule une seule fois ; RETURN donne le résultat.
| À quoi ça sert | DAX |
|---|---|
| Une variable | Margin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue ) |
| Plusieurs variables | Sales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY |
| Une table dans une variable | Top 5 Total = VAR Top5 = TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) RETURN CALCULATE ( [Total Sales], Top5 ) |
Étapes Power Query (M)
Power Query met en forme les données avant leur chargement. Voici les formules M derrière les boutons les plus courants.
| À quoi ça sert | M |
|---|---|
| Garder les lignes qui correspondent | Table.SelectRows(Source, each [Status] = "Paid") |
| Supprimer des colonnes | Table.RemoveColumns(Source, {"Notes", "Temp"}) |
| Définir les types de colonnes | Table.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}}) |
| Renommer une colonne | Table.RenameColumns(Source, {{"amt", "Amount"}}) |
| Ajouter une colonne | Table.AddColumn(Source, "Total", each [Quantity] * [Price], type number) |
| Fusionner (join) deux requêtes | Table.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"}, "Product", JoinKind.LeftOuter) |
| Ajouter (empiler) des requêtes | Table.Combine({Sales2024, Sales2025}) |
| Dépivoter des colonnes en lignes | Table.UnpivotOtherColumns(Source, {"Product"}, "Month", "Amount") |
| Regrouper et agréger | Table.Group(Source, {"Category"}, {{"Sales", each List.Sum([Amount]), type number}}) |
| Remplacer les erreurs par une valeur | Table.ReplaceErrorValues(Source, {{"Amount", 0}}) |
Cet aide-mémoire Power BI rassemble sur une seule page le DAX que l'on écrit le plus souvent : les agrégations, les itérateurs X, CALCULATE et les fonctions qui modifient les filtres, Time Intelligence, les fonctions de texte et de date, et des modèles de mesures à copier, comme le pourcentage du total, la croissance d'une année sur l'autre et les cumuls.
Les exemples utilisent un modèle de ventes avec les tables Sales, Product, Customer et 'Date' ; renommez-les selon votre modèle. Le DAX a été analysé par le moteur du cours Power BI de Coddy, où vous pouvez l'écrire dans un espace de travail Power BI dans votre navigateur et le faire vérifier.
Questions fréquentes sur l'aide-mémoire Power BI
Cet aide-mémoire Power BI est-il gratuit ?
Oui. Consultez-le ici ou ajoutez-le à vos favoris ; aucune inscription n'est nécessaire.
Quelle est la différence entre une mesure et une colonne calculée ?
Une colonne calculée est calculée une fois par ligne lors de l'actualisation et stockée, vous pouvez donc filtrer par elle avec un segment. Une mesure est calculée pour chaque cellule d'un visuel, avec les filtres de cette cellule, et ne stocke rien. Les totaux et les ratios vont dans des mesures.
Que fait CALCULATE ?
Elle évalue une expression avec des filtres modifiés : elle ajoute, remplace ou supprime des filtres, puis calcule le résultat. La plupart du DAX qui va au-delà des totaux simples, c'est CALCULATE avec les bons arguments de filtre.
Pourquoi utiliser DIVIDE plutôt que l'opérateur / ?
DIVIDE renvoie une valeur vide (ou une valeur de votre choix) quand le diviseur vaut zéro ou est vide. L'opérateur / renvoie l'infini ou une valeur d'erreur, qui s'affiche dans les visuels.Faut-il une table de dates pour Time Intelligence ?
TOTALYTD et SAMEPERIODLASTYEAR ont besoin d'une table avec une ligne par jour, sans trous et des années complètes, reliée à vos tables de faits et marquée comme table de dates.Ce DAX fonctionne-t-il dans Power Pivot pour Excel et dans Analysis Services ?
Le langage DAX est commun, donc presque tout fonctionne aussi là-bas. Quelques fonctions récentes arrivent d'abord dans Power BI.
Où puis-je m'entraîner au DAX ?
Dans le cours Power BI de Coddy : chaque leçon vous donne un espace de travail Power BI dans le navigateur et vérifie votre mesure sur les données de la leçon et sur des copies cachées de ces données.