Menu
CoddyTech

Aide-mémoire Power BI

Dernière mise à jour

Apprenez Power BI gratuitement

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 sertDAX
Créer une mesureTotal 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éeTop Customers = TOPN ( 10, Customer, [Total Sales] )
Faire référence à une colonne : le nom de la table, puis la colonne entre crochetsSales[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 mesureAverage Price = DIVIDE ( [Total Sales], [Total Units] )

Fonctions d'agrégation

Chacune résume une colonne dans le contexte de filtre actuel.

À quoi ça sertDAX
Additionner une colonneSUM ( Sales[Amount] )
Moyenne d'une colonneAVERAGE ( Sales[Amount] )
Plus petite valeurMIN ( Sales[Order Date] )
Plus grande valeurMAX ( Sales[Order Date] )
Compter les lignes d'une tableCOUNTROWS ( Sales )
Compter les valeurs non vides d'une colonneCOUNT ( Sales[Amount] )
Compter les valeurs distinctesDISTINCTCOUNT ( Sales[Customer Key] )
Diviser sans risque : une valeur vide au lieu d'une erreur quand le diviseur vaut 0DIVIDE ( [Total Sales], [Total Units] )
Diviser avec une valeur à afficher quand le diviseur vaut 0DIVIDE ( [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 sertDAX
Multiplier par ligne, puis additionnerSUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Moyenne d'un résultat par ligneAVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Plus grand résultat par ligneMAXX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Moyenne d'une mesure par clientAVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] )
Utiliser une colonne d'une table liée dans l'expressionSUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) )
Compter les lignes qui remplissent une conditionCOUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) )
Classer chaque produit selon une mesureRANKX ( 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 texteCONCATENATEX ( 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 sertDAX
Filtrer sur une valeurCALCULATE ( [Total Sales], Product[Category] = "Bikes" )
Filtrer sur une liste de valeursCALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } )
Deux filtres (AND)CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" )
OR sur deux colonnesCALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) )
Filtrer selon une mesureCALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Garder le filtre existant et faire l'intersection avec luiCALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) )
Supprimer les filtres d'une colonneCALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) )
Supprimer tous les filtres d'une tableCALCULATE ( [Total Sales], ALL ( Product ) )
Supprimer tous les filtres d'une table sauf certaines colonnesCALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) )
Garder la sélection des segments, ignorer les lignes du visuel lui-mêmeCALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) )
Utiliser une relation inactiveCALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) )
Faire passer un filtre dans les deux sens pour une mesureCALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) )
Filtrer par une table sans relationCALCULATE ( [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 sertDAX
Cumul depuis le début de l'annéeTOTALYTD ( [Total Sales], 'Date'[Date] )
Cumul depuis le début de l'année, exercice fiscal clos le 30 juinTOTALYTD ( [Total Sales], 'Date'[Date], "6/30" )
Cumul depuis le début de l'année dans CALCULATECALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) )
Cumul depuis le début du trimestreTOTALQTD ( [Total Sales], 'Date'[Date] )
Cumul depuis le début du moisTOTALMTD ( [Total Sales], 'Date'[Date] )
Même période l'année précédenteCALCULATE ( [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 entierCALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) )
La période entière un an plus tôtCALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) )
Les 12 derniers mois jusqu'à la dernière date visibleCALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) )
Une plage de dates fixeCALCULATE ( [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 sertDAX
Pourcentage de toutes les catégoriesCategory % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) )
Pourcentage de ce que laissent les segmentsVisible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) )
Croissance d'une année sur l'autreYoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear )
Cumul sur toute la périodeRunning 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 5Top 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] )
Compter les clients au-dessus d'un seuilBig Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Faire en sorte qu'un total additionne ses lignesBonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] )
Afficher une valeur à un seul niveau d'une matriceCategory Rank = IF ( ISINSCOPE ( Product[Category] ), RANKX ( ALL ( Product[Category] ), [Total Sales] ) )
Solde de clôture : la dernière date qui a une valeurClosing 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 sertDAX
Une conditionIF ( [Total Sales] > 1000, "High", "Low" )
Plusieurs valeurs d'une expressionSWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" )
Des tranches, testées de haut en basSWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" )
AND et ORIF ( Sales[Quantity] > 2 && Sales[Amount] > 50, "Big", "Small" )
La valeur est-elle vide ?ISBLANK ( [Total Sales] )
Première valeur non videCOALESCE ( [Total Sales], 0 )
Le filtre laisse-t-il exactement une valeur ?HASONEVALUE ( Product[Category] )
Cette valeur unique, ou une valeur par défautSELECTEDVALUE ( Product[Category], "All categories" )
Cette ligne du visuel est-elle regroupée par la colonne ?ISINSCOPE ( Product[Category] )
Renvoyer une valeur videBLANK ()

Fonctions de texte

L'opérateur & concatène du texte ; FORMAT transforme un nombre ou une date en texte.

À quoi ça sertDAX
Concaténer du texteCustomer[First Name] & " " & Customer[Last Name]
Mettre en forme un nombreFORMAT ( [Total Sales], "#,0.00" )
Mettre en forme une dateFORMAT ( 'Date'[Date], "mmm yyyy" )
Premiers caractèresLEFT ( Product[Code], 3 )
Caractères à partir d'une positionMID ( Product[Code], 4, 2 )
LongueurLEN ( Product[Name] )
MajusculesUPPER ( Store[City] )
Supprimer les espaces en tropTRIM ( Customer[Name] )
Remplacer du texteSUBSTITUTE ( 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 sertDAX
La date du jourTODAY ()
Construire une dateDATE ( 2025, 12, 31 )
Année d'une dateYEAR ( 'Date'[Date] )
Numéro du moisMONTH ( 'Date'[Date] )
Jour de la semaine, lundi valant 1WEEKDAY ( 'Date'[Date], 2 )
Numéro de semaine, semaines commençant le lundiWEEKNUM ( 'Date'[Date], 2 )
Dernier jour du moisEOMONTH ( 'Date'[Date], 0 )
Même jour un mois plus tôtEDATE ( 'Date'[Date], -1 )
Nombre de jours entre deux datesDATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY )
Une table de dates à partir de dates fixesCALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) )
Une table de dates à partir des dates du modèleCALENDARAUTO ()

Relations et recherches

RELATED suit une relation du côté plusieurs vers le côté un.

À quoi ça sertDAX
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 relationLOOKUPVALUE ( 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 lignesUSERPRINCIPALNAME ()

Fonctions de table

Elles renvoient des tables : utilisez-les dans une table calculée, dans CALCULATE ou dans un itérateur.

À quoi ça sertDAX
Valeurs distinctes dans le filtre actuelVALUES ( Product[Category] )
Lignes qui remplissent une conditionFILTER ( Product, Product[Price] > 100 )
Les N premières lignes selon une mesureTOPN ( 5, ALL ( Product[Product] ), [Total Sales] )
Regrouper par colonnes et ajouter des mesuresSUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] )
Ajouter une colonne à une tableADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] )
Choisir et renommer des colonnesSELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] )
Une liste de nombresGENERATESERIES ( 1, 10, 1 )
Toutes les combinaisons de deux tablesCROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) )
Empiler deux tables qui ont les mêmes colonnesUNION ( 'Sales 2024', 'Sales 2025' )

Variables

VAR nomme une étape et la calcule une seule fois ; RETURN donne le résultat.

À quoi ça sertDAX
Une variableMargin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue )
Plusieurs variablesSales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY
Une table dans une variableTop 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 sertM
Garder les lignes qui correspondentTable.SelectRows(Source, each [Status] = "Paid")
Supprimer des colonnesTable.RemoveColumns(Source, {"Notes", "Temp"})
Définir les types de colonnesTable.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}})
Renommer une colonneTable.RenameColumns(Source, {{"amt", "Amount"}})
Ajouter une colonneTable.AddColumn(Source, "Total", each [Quantity] * [Price], type number)
Fusionner (join) deux requêtesTable.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"}, "Product", JoinKind.LeftOuter)
Ajouter (empiler) des requêtesTable.Combine({Sales2024, Sales2025})
Dépivoter des colonnes en lignesTable.UnpivotOtherColumns(Source, {"Product"}, "Month", "Amount")
Regrouper et agrégerTable.Group(Source, {"Category"}, {{"Sales", each List.Sum([Amount]), type number}})
Remplacer les erreurs par une valeurTable.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 ?
Oui. Des fonctions comme 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.

Illustration des langages de programmation de Coddy

Apprenez Power BI avec Coddy

Commencer