DAX Power BI : les formules essentielles, avec exemples
Les formules DAX qui couvrent la plupart des rapports Power BI, classées par usage, avec des exemples prêts à copier et les règles de contexte qui les font fonctionner.

Qu'est-ce que le DAX dans Power BI ?
Le DAX (Data Analysis Expressions) est le langage de formules de Power BI, d'Excel Power Pivot et d'Analysis Services, utilisé pour créer des mesures, des colonnes calculées et des tables calculées. Il ressemble aux formules Excel, mais il travaille sur des tables et des colonnes plutôt que sur des cellules, et ses résultats changent selon les filtres appliqués dans le rapport. Inutile de connaître des centaines de fonctions : une quinzaine couvre l'essentiel des tableaux de bord métier.
Tous les exemples ci-dessous utilisent un schéma en étoile simple :
| Table | Colonnes principales |
|---|---|
Ventes (faits) | NumCommande, ClientID, ProduitID, MagasinID, Date, Quantite, PrixUnitaire, CoutUnitaire, Montant |
Produit | ProduitID, NomProduit, Categorie |
Magasin | MagasinID, Ville, Region |
Client | ClientID, NomClient |
'Date' | Date, Annee, Mois, NumMois (marquée comme table de dates) |
Si votre modèle n'a pas encore cette forme, commencez par le guide du modèle en étoile Power BI : le DAX devient beaucoup plus simple sur un modèle propre.
Mesure ou colonne calculée : laquelle choisir ?
| Mesure | Colonne calculée | |
|---|---|---|
| Calculée | À la requête, pour chaque cellule du visuel | À l'actualisation, une fois par ligne |
| Réagit aux filtres | Oui | Non (valeur stockée) |
| Mémoire | Aucune tant qu'elle n'est pas utilisée | Augmente la taille du modèle |
| Usage typique | Totaux, ratios, KPI | Catégories pour filtrer ou regrouper |
Règle simple : pour afficher un nombre, écrivez une mesure. Pour filtrer par une valeur, une colonne calculée (ou mieux, une colonne Power Query) convient.
-- Colonne calculée dans la table Ventes
Marge Ligne = Ventes[Quantite] * ( Ventes[PrixUnitaire] - Ventes[CoutUnitaire] )
Quelles sont les formules DAX de base ?
Total Ventes = SUM ( Ventes[Montant] )
Commandes = DISTINCTCOUNT ( Ventes[NumCommande] )
Clients Actifs = DISTINCTCOUNT ( Ventes[ClientID] )
Lignes de Vente = COUNTROWS ( Ventes )
Panier Moyen = DIVIDE ( [Total Ventes], [Commandes] )
Préférez toujours DIVIDE à l'opérateur / : il renvoie BLANK au lieu d'une erreur quand le dénominateur vaut zéro, et un troisième argument facultatif permet de choisir une autre valeur.
Comment fonctionnent les itérateurs comme SUMX ?
Les itérateurs (SUMX, AVERAGEX, MINX, MAXX, COUNTX) évaluent une expression ligne par ligne, puis agrègent. Utilisez-les quand le calcul doit se faire avant la somme :
Marge Totale =
SUMX ( Ventes, Ventes[Quantite] * ( Ventes[PrixUnitaire] - Ventes[CoutUnitaire] ) )
Taux de Marge = DIVIDE ( [Marge Totale], [Total Ventes] )
Cette mesure remplace la colonne calculée précédente et économise de la mémoire.
Comment fonctionne CALCULATE ?
CALCULATE est la fonction DAX la plus importante : elle évalue une expression dans un contexte de filtre modifié. Toutes les mesures du type « ventes de X », « part du total » ou « même période l'an dernier » l'utilisent.
Ajouter ou remplacer un filtre
Ventes Casablanca =
CALCULATE ( [Total Ventes], Magasin[Ville] = "Casablanca" )
Ventes Casablanca ou Rabat =
CALCULATE ( [Total Ventes], Magasin[Ville] IN { "Casablanca", "Rabat" } )
Retirer des filtres pour calculer une part du total
Part Tous Produits =
DIVIDE (
[Total Ventes],
CALCULATE ( [Total Ventes], REMOVEFILTERS ( Produit ) )
)
Part de la Selection =
DIVIDE (
[Total Ventes],
CALCULATE ( [Total Ventes], ALLSELECTED ( Produit ) )
)
La première ignore tous les filtres sur les produits ; la seconde respecte ce que l'utilisateur a choisi dans les segments, mais ignore la ligne du visuel.
Conserver le filtre existant
Par défaut, un filtre dans CALCULATE remplace un filtre existant sur la même colonne. KEEPFILTERS fait l'intersection :
Ventes Electromenager (conserve) =
CALCULATE ( [Total Ventes], KEEPFILTERS ( Produit[Categorie] = "Electromenager" ) )
Filtrer sur une mesure avec FILTER
Un filtre booléen simple dans CALCULATE ne peut pas faire référence à une mesure. Utilisez FILTER sur une table de valeurs :
Clients Plus de 100k =
COUNTROWS (
FILTER ( VALUES ( Ventes[ClientID] ), [Total Ventes] > 100000 )
)
Quelles formules de time intelligence connaître ?
Les fonctions de time intelligence exigent une table de dates avec une ligne par jour, sans trou, marquée comme table de dates et reliée à la table de faits.
Ventes YTD = TOTALYTD ( [Total Ventes], 'Date'[Date] )
Ventes N-1 =
CALCULATE ( [Total Ventes], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
Ventes Mois Precedent =
CALCULATE ( [Total Ventes], DATEADD ( 'Date'[Date], -1, MONTH ) )
Ventes 12 Mois Glissants =
CALCULATE (
[Total Ventes],
DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH )
)
Moyenne Mensuelle 3 Mois =
DIVIDE (
CALCULATE (
[Total Ventes],
DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -3, MONTH )
),
3
)
Pour un exercice fiscal qui ne se termine pas le 31 décembre, indiquez la date de clôture : TOTALYTD ( [Total Ventes], 'Date'[Date], "06-30" ).
Comment écrire un DAX plus lisible avec les variables ?
VAR stocke un résultat intermédiaire, évalué une seule fois, et RETURN renvoie la valeur finale. Les variables rendent les mesures plus lisibles et souvent plus rapides :
Evolution N-1 % =
VAR VentesActuelles = [Total Ventes]
VAR VentesPrecedentes =
CALCULATE ( [Total Ventes], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
RETURN
IF (
NOT ISBLANK ( VentesPrecedentes ),
DIVIDE ( VentesActuelles - VentesPrecedentes, VentesPrecedentes )
)
Classement, top N et texte dynamique
Rang Produit =
RANKX ( ALL ( Produit[NomProduit] ), [Total Ventes], , DESC, DENSE )
Ventes Top 5 Produits =
CALCULATE (
[Total Ventes],
TOPN ( 5, ALL ( Produit[NomProduit] ), [Total Ventes], DESC )
)
Titre Rapport =
"Ventes - " & SELECTEDVALUE ( Magasin[Ville], "Toutes les villes" )
Titre Rapport sert de titre dynamique (Titre > fx) : l'en-tête change avec le segment sélectionné.
Segmenter avec SWITCH
Une colonne calculée dans la table Client qui classe les clients selon leur chiffre d'affaires :
Segment Client =
VAR CAClient = CALCULATE ( SUM ( Ventes[Montant] ) )
RETURN
SWITCH (
TRUE (),
CAClient >= 100000, "Grand compte",
CAClient >= 20000, "Moyen",
"Petit"
)
Le CALCULATE sans filtre déclenche la transition de contexte : la ligne client courante devient un filtre sur la table Ventes.
Aide-mémoire : quelle fonction DAX pour quel besoin ?
| Besoin | Fonction(s) |
|---|---|
| Somme, comptage, comptage distinct | SUM, COUNTROWS, DISTINCTCOUNT |
| Ratio sans erreur | DIVIDE |
| Calcul ligne à ligne | SUMX, AVERAGEX |
| Modifier les filtres | CALCULATE, REMOVEFILTERS, ALL, ALLSELECTED, KEEPFILTERS |
| Condition complexe | FILTER |
| Cumul annuel, N-1, glissant | TOTALYTD, SAMEPERIODLASTYEAR, DATEADD, DATESINPERIOD |
| Stock en fin de période | CALCULATE avec LASTDATE |
| Classement | RANKX, TOPN |
| Valeur sélectionnée, libellé dynamique | SELECTEDVALUE |
| Conditions multiples | SWITCH ( TRUE (), … ) |
Tester une mesure dans la vue de requête DAX
Power BI Desktop propose une vue de requête DAX pour vérifier une mesure sous forme de table :
EVALUATE
SUMMARIZECOLUMNS (
'Date'[Annee],
Magasin[Ville],
"Ventes", [Total Ventes],
"Evolution %", [Evolution N-1 %]
)
ORDER BY 'Date'[Annee], Magasin[Ville]
Comparez le résultat avec le système source avant de placer la mesure sur une page.
Quelles sont les erreurs DAX les plus fréquentes ?
- Utiliser des colonnes calculées pour des totaux et ratios qui devraient être des mesures.
- Diviser avec
/et obtenir des erreurs ou l'infini sur les périodes vides. - Faire de la time intelligence sans vraie table de dates continue.
- Activer des relations bidirectionnelles pour « réparer » une mesure, ce qui crée des résultats ambigus.
- Calculer un ratio comme la moyenne de ratios ligne à ligne au lieu du ratio des totaux.
La référence officielle des fonctions sur Microsoft Learn (référence DAX) permet de vérifier chaque argument.
Comment organiser et nommer ses mesures ?
- Rangez toutes les mesures dans une table dédiée (par exemple
_Mesures) et regroupez-les en dossiers d'affichage : Ventes, Marge, Temps, Clients. - Utilisez des noms explicites et lisibles par les métiers :
Evolution N-1 %plutôt queMesure 12. - Construisez les mesures complexes sur des mesures simples (
[Total Ventes], puis[Ventes N-1], puis[Evolution N-1 %]) : une définition ne change qu'à un seul endroit. - Ajoutez une description à chaque mesure ; elle s'affiche en info-bulle dans la liste des champs.
Le DAX est-il demandé sur le marché marocain ?
Oui : dans les offres de data analyst, de développeur BI et de contrôleur de gestion à Casablanca et Rabat, « Power BI » s'accompagne souvent de « DAX » et de « Power Query ». Savoir expliquer CALCULATE et le contexte de filtre en entretien fait la différence avec un profil qui ne fait que glisser des visuels. La certification PL-300 évalue d'ailleurs explicitement ces compétences.
Conclusion
Avec SUM, DIVIDE, SUMX, CALCULATE et ses modificateurs de filtre, quelques fonctions de time intelligence, RANKX et les variables, vous construisez la plupart des KPI métier dans Power BI. Maîtrisez le contexte de filtre avant d'apprendre des fonctions par cœur. Pour mettre ces mesures en pages, voyez les exemples de tableaux de bord Power BI ; pour un projet sur vos propres données, le service de tableaux de bord Power BI.
Questions fréquentes
Power Query (langage M) prépare et charge les données avant qu'elles n'entrent dans le modèle : nettoyage, fusion, restructuration. Le DAX calcule des mesures et des colonnes sur le modèle chargé et réagit aux filtres du rapport.



