Power BI sait transformer des données brutes en tableaux de bord très lisibles. Mais dès que l’on veut répondre à des questions métier précises — chiffre d’affaires du mois précédent, part d’un produit dans le total, évolution annuelle ou moyenne par client — il faut généralement passer par le langage DAX.

DAX, pour Data Analysis Expressions, est le langage de formules utilisé dans Power BI, Power Pivot et Analysis Services. Il ressemble parfois à Excel, mais son fonctionnement repose sur une notion essentielle : le contexte. C’est lui qui explique pourquoi une mesure peut afficher un résultat différent selon le filtre, le graphique ou la ligne sélectionnée.

Dans ce guide pratique, nous allons voir les bases du DAX, les fonctions incontournables et une méthode simple pour construire des formules fiables sans transformer son modèle Power BI en labyrinthe.

DAX dans Power BI : à quoi sert ce langage ?

DAX permet de créer des calculs à partir des données importées dans Power BI. Ces calculs prennent principalement deux formes :

  • les colonnes calculées, calculées ligne par ligne au moment du chargement ou de l’actualisation des données ;
  • les mesures, calculées à la demande selon le contexte du rapport.

Imaginons une table Ventes contenant les colonnes suivantes :

  • Date ;
  • Produit ;
  • Quantité ;
  • Prix unitaire ;
  • Coût unitaire.

Une colonne calculée pourrait calculer la marge de chaque ligne :

Marge ligne = Ventes[Quantité] * (Ventes[Prix unitaire] - Ventes[Coût unitaire])

Une mesure calculerait ensuite la marge totale :

Marge totale = SUM(Ventes[Marge ligne])

La différence est importante. La colonne stocke un résultat pour chaque ligne. La mesure, elle, s’adapte aux filtres appliqués dans le rapport. Dans la plupart des cas, il vaut mieux privilégier les mesures afin de conserver un modèle plus léger et plus flexible.

La syntaxe DAX à connaître

Une formule DAX suit généralement cette structure :

Nom de la mesure = FONCTION(Table[Colonne])

Par exemple :

Chiffre d'affaires = SUM(Ventes[Montant])

Les noms de tables et de colonnes sont placés entre crochets. Lorsqu’un nom de table contient un espace, il faut l’entourer d’apostrophes :

'Détail des ventes'[Montant]

Les fonctions DAX utilisent souvent des virgules comme séparateurs dans la documentation anglophone. Selon vos paramètres régionaux, Power BI peut utiliser des points-virgules. Si une formule semble correcte mais déclenche une erreur, vérifiez ce point avant d’accuser DAX de mauvaise foi.

Voici quelques fonctions simples et très utilisées :

  • SUM additionne les valeurs d’une colonne ;
  • AVERAGE calcule une moyenne ;
  • MIN et MAX renvoient une valeur minimale ou maximale ;
  • COUNT compte les valeurs numériques ;
  • COUNTA compte les valeurs non vides ;
  • DISTINCTCOUNT compte les valeurs distinctes.

Exemples :

Quantité vendue = SUM(Ventes[Quantité])Prix moyen = AVERAGE(Ventes[Prix unitaire])Nombre de clients = DISTINCTCOUNT(Ventes[ClientID])

Mesure ou colonne calculée : quel choix faire ?

Cette question revient souvent, et la réponse dépend de l’objectif.

Utilisez une colonne calculée lorsque vous avez besoin d’une valeur propre à chaque ligne, par exemple une catégorie, une clé de recherche ou un indicateur qui sera utilisé comme axe ou filtre.

Type de vente = IF(Ventes[Montant] >= 1000, "Grande vente", "Vente standard")

Utilisez plutôt une mesure lorsque le résultat doit réagir aux filtres du rapport :

Chiffre d'affaires = SUM(Ventes[Montant])

Une mesure affichera le chiffre d’affaires de l’ensemble des ventes dans une carte. Dans un tableau par région, elle affichera le chiffre d’affaires de chaque région. Dans un graphique mensuel, elle se recalculera pour chaque mois. C’est toute la puissance du contexte de filtre.

Comprendre le contexte de filtre

Le contexte de filtre correspond à l’ensemble des filtres actifs au moment où une mesure est évaluée. Ces filtres peuvent venir :

  • d’un segment ajouté à la page ;
  • d’un filtre de rapport ;
  • d’une ligne ou d’une colonne d’un visuel ;
  • d’une relation entre les tables.

Supposons cette mesure :

Chiffre d'affaires = SUM(Ventes[Montant])

Dans une carte sans filtre, elle affiche le total général. Dans un tableau contenant la colonne Produit, Power BI évalue la mesure produit par produit. La formule ne change pas, mais le contexte, lui, change.

C’est une différence majeure avec Excel. Dans Excel, vous raisonnez souvent cellule par cellule. Dans Power BI, vous définissez une mesure et le moteur l’évalue dans chaque contexte nécessaire.

La fonction CALCULATE, véritable couteau suisse

CALCULATE modifie le contexte de filtre avant d’évaluer une expression. C’est probablement la fonction DAX la plus importante à maîtriser.

Pour calculer le chiffre d’affaires uniquement pour la catégorie « Accessoires » :

CA accessoires =CALCULATE(    [Chiffre d'affaires],    Produits[Catégorie] = "Accessoires")

Pour ignorer les filtres appliqués à une colonne :

CA total produits =CALCULATE(    [Chiffre d'affaires],    ALL(Produits))

Cette mesure peut servir à calculer le poids d’un produit dans le chiffre d’affaires global :

Part du produit =DIVIDE(    [Chiffre d'affaires],    [CA total produits])

La fonction DIVIDE est préférable à l’opérateur `/`, car elle gère proprement les divisions par zéro. Vous pouvez même prévoir une valeur de remplacement :

Taux de marge =DIVIDE(    [Marge totale],    [Chiffre d'affaires],    0)

Le contexte de ligne et la fonction SUMX

Certaines opérations nécessitent de parcourir les lignes une par une. C’est le rôle des fonctions itératrices, dont le nom se termine souvent par X : SUMX, AVERAGEX, COUNTX ou MINX.

Pour calculer directement la marge sans créer de colonne calculée :

Marge totale =SUMX(    Ventes,    Ventes[Quantité] *    (Ventes[Prix unitaire] - Ventes[Coût unitaire]))

SUMX parcourt la table Ventes, calcule l’expression pour chaque ligne, puis additionne les résultats.

Cette approche est très pratique lorsque le calcul dépend de plusieurs colonnes. Elle évite aussi de multiplier les colonnes calculées dans le modèle. En revanche, sur une table de plusieurs dizaines de millions de lignes, il faudra surveiller les performances et optimiser le modèle.

Utiliser les variables pour rendre les formules lisibles

Les variables rendent les mesures plus claires, plus faciles à tester et souvent plus performantes. Elles se déclarent avec VAR et le résultat final est renvoyé avec RETURN.

Taux de marge =VAR Marge = [Marge totale]VAR CA = [Chiffre d'affaires]RETURN    DIVIDE(Marge, CA, 0)

Les variables sont particulièrement utiles pour les calculs plus complexes :

Statut performance =VAR CA actuel = [Chiffre d'affaires]VAR Objectif = [Objectif de ventes]RETURN    IF(        CA actuel >= Objectif,        "Objectif atteint",        "Objectif non atteint"    )

Au lieu de répéter plusieurs fois la même expression, vous lui donnez un nom explicite. Votre futur vous remerciera lors de la prochaine modification du tableau de bord.

Les fonctions de temps et la table calendrier

Les analyses temporelles sont au cœur de nombreux rapports : comparaison avec l’année précédente, cumul annuel, évolution mensuelle ou moyenne glissante.

Pour obtenir des résultats fiables, créez une table calendrier dédiée. Elle doit contenir une ligne par jour, sans trou dans la séquence de dates. Vous pouvez la générer avec :

Calendrier =CALENDAR(    DATE(2022, 1, 1),    DATE(2025, 12, 31))

Ajoutez ensuite des colonnes utiles :

Année = YEAR(Calendrier[Date])Mois = FORMAT(Calendrier[Date], "mmmm")Numéro du mois = MONTH(Calendrier[Date])

Reliez la colonne Calendrier[Date] à la colonne de date de votre table de ventes, puis marquez la table comme table de dates dans Power BI.

Pour comparer le chiffre d’affaires avec l’année précédente :

CA année précédente =CALCULATE(    [Chiffre d'affaires],    SAMEPERIODLASTYEAR(Calendrier[Date]))

Pour calculer l’évolution :

Évolution annuelle =VAR CA actuel = [Chiffre d'affaires]VAR CA précédent = [CA année précédente]RETURN    DIVIDE(CA actuel - CA précédent, CA précédent, 0)

Vous pouvez aussi calculer un cumul depuis le début de l’année :

CA cumul annuel =TOTALYTD(    [Chiffre d'affaires],    Calendrier[Date])

Attention toutefois : les fonctions temporelles dépendent de la qualité de votre table calendrier et de la relation entre les tables. Si la relation est absente ou inactive, le résultat risque d’être surprenant.

Filtrer avec FILTER, VALUES et SELECTEDVALUE

FILTER permet d’appliquer une condition plus élaborée qu’un simple filtre de colonne.

CA ventes importantes =CALCULATE(    [Chiffre d'affaires],    FILTER(        Ventes,        Ventes[Montant] > 1000    ))

Utilisez cette fonction avec discernement : FILTER peut être coûteuse sur de très grandes tables. Lorsque c’est possible, préférez un filtre direct dans CALCULATE.

VALUES renvoie les valeurs distinctes visibles dans le contexte courant. SELECTEDVALUE, quant à elle, renvoie une valeur lorsqu’une seule valeur est sélectionnée :

Produit sélectionné =SELECTEDVALUE(    Produits[Nom du produit],    "Plusieurs produits")

Cette mesure peut être affichée dans un titre dynamique ou dans une carte. Elle indique clairement à l’utilisateur ce que le rapport est en train d’analyser.

Quelques erreurs fréquentes en DAX

Les erreurs viennent souvent moins de la formule que du modèle de données. Voici les problèmes les plus courants :

  • confondre une colonne calculée et une mesure ;
  • oublier de créer une relation entre les tables ;
  • utiliser une date provenant directement de la table de ventes au lieu d’une table calendrier ;
  • diviser deux valeurs sans gérer le cas du dénominateur nul ;
  • employer ALL alors que l’on souhaite conserver certains filtres ;
  • créer trop de colonnes calculées dans une table volumineuse ;
  • ne pas vérifier le type de données des colonnes.

Pour diagnostiquer une mesure, commencez simplement. Placez-la dans une carte, puis dans un tableau avec plusieurs dimensions : année, mois, produit ou région. Si le résultat devient incohérent, vous identifierez plus facilement le contexte qui pose problème.

Une méthode efficace pour écrire ses mesures

Avant d’écrire du DAX, reformulez le besoin avec des mots simples. Par exemple : « Je veux la marge des ventes de l’année sélectionnée, divisée par le chiffre d’affaires de cette même période. »

Ensuite, procédez par étapes :

  • créez une mesure de chiffre d’affaires ;
  • créez une mesure de marge ;
  • testez chaque mesure dans un visuel simple ;
  • combinez-les avec DIVIDE ;
  • ajoutez les filtres avec CALCULATE si nécessaire ;
  • utilisez des variables lorsque la formule devient longue.

Cette méthode évite de produire une formule monumentale dès le premier essai. En DAX comme en bricolage, mieux vaut mesurer deux fois avant de couper une fois.

Les bonnes pratiques pour un modèle DAX performant

Un bon calcul commence par un bon modèle. Séparez autant que possible les tables de faits, comme les ventes, des tables de dimensions, comme les produits, les clients et le calendrier. Cette organisation en étoile facilite les relations et les calculs.

Nommez vos mesures de façon explicite : CA total, Marge totale, CA année précédente. Évitez les noms génériques comme « Calcul 1 » ou « Mesure test », qui deviennent rapidement incompréhensibles.

Enfin, créez un dossier dédié aux mesures dans Power BI. Vous retrouverez plus facilement vos indicateurs et vous éviterez de les disperser dans toutes les tables du modèle.

Le DAX devient beaucoup plus accessible lorsqu’on ne cherche pas à mémoriser des centaines de fonctions. Commencez par maîtriser SUM, CALCULATE, DIVIDE, SUMX, FILTER, les variables et les fonctions de temps. Avec ces bases, vous pourrez déjà construire des indicateurs très solides et répondre à une grande partie des besoins d’analyse dans Power BI.