Bienvenue dans le monde de Power BI et de son langage de formules DAX (Data Analysis Expressions) ! 😊

Si tu débutes avec Power BI, tu découvriras vite que les formules DAX sont la clé pour transformer tes données brutes en analyses percutantes.

Elles te permettent de créer des mesures personnalisées, d’agréger des informations, de filtrer des jeux de données et bien plus, le tout afin de donner du sens à tes données 📊.

Dans cet article, nous allons explorer 20 formules DAX incontournables pour tout débutant sur Power BI.

Chaque formule sera présentée de manière narrative avec des cas d’usage concrets, pour que tu comprennes non seulement comment l’utiliser, mais surtout pourquoi et dans quelle situation elle va t’être utile.

Pour rappel : Oui les formules Power BI ressemblent aux formules d’excel dans l’approche mais cela reste des outils différents !

1. SUM() : La base de l’addition des données

Description : La fonction SUM() est l’une des plus basiques et indispensables en DAX. Elle te permet d’additionner toutes les valeurs d’une colonne numérique. En somme (sans jeu de mots 😜), c’est l’équivalent du signe « + » appliqué sur une série de données. C’est souvent la première formule que l’on apprend car elle sert de fondation à de nombreuses analyses (total des ventes, total des quantités, etc.).

Quand l’utiliser ? Imagine que tu as une table Ventes avec une colonne Montant représentant le chiffre d’affaires de chaque transaction. Pour connaître le chiffre d’affaires total, tu vas tout simplement utiliser SUM(Ventes[Montant]). Instantanément, Power BI te donnera la somme de tous les montants de vente. Pratique, n’est-ce pas ? 👍

Exemple concret :
Supposons que tu gères une petite boutique en ligne et que tu disposes d’une table de données listant chaque commande avec son montant. Tu souhaites connaître le total des ventes réalisées sur une période donnée. En créant une mesure DAX nommée par exemple Total Ventes et définie comme suit :

daxCopierTotal Ventes = SUM(Ventes[Montant])

tu obtiendras le chiffre d’affaires cumulé de toutes tes ventes. Tu peux ensuite utiliser cette mesure dans un visuel (comme une carte KPI ou un graphique) pour afficher le total des ventes. 🎉

Cas d’usage pratiques :

  • Calculer le total des ventes par mois, trimestre ou année pour suivre l’évolution du chiffre d’affaires.
  • Additionner les heures travaillées par employé pour une analyse du temps de travail.
  • Agréger les dépenses totales par département dans un rapport financier.

2. AVERAGE() : La moyenne pour évaluer les tendances

Description : La fonction AVERAGE() calcule la moyenne des valeurs d’une colonne. Elle est très utile pour obtenir une vue d’ensemble de tes données, en identifiant par exemple la tendance centrale ou la performance moyenne d’un indicateur. C’est un moyen rapide de répondre à des questions du type « En moyenne, combien… ? ».

Quand l’utiliser ? Chaque fois que tu as une série de valeurs numériques et que tu veux en connaître la moyenne. Par exemple, si ta table Ventes contient un champ Montant, AVERAGE(Ventes[Montant]) te donnera le montant moyen d’une transaction. Cela peut servir à évaluer le panier moyen par client, ou le montant moyen des ventes quotidiennes, etc.

Exemple concret :
Imaginons que tu analyses les dépenses moyennes par client sur ton site e-commerce. En utilisant une mesure DAX Dépense Moyenne définie comme :

daxCopierDépense Moyenne = AVERAGE(Ventes[Montant])

tu obtiendras le montant moyen dépensé par commande. Si tu filtres ce résultat par client (par exemple via un segment dans Power BI), tu pourras voir quel est le panier moyen de chaque client. Utile pour identifier qui sont tes plus gros acheteurs ou au contraire cibler ceux qui dépensent le moins en moyenne. 🙂

Cas d’usage pratiques :

  • Calculer le salaire moyen des employés dans une entreprise pour se situer par rapport au marché.
  • Évaluer la dépense moyenne par client afin de segmenter la clientèle (petits vs gros acheteurs).
  • Mesurer la note moyenne attribuée par des clients à un produit ou un service pour en évaluer la satisfaction générale.

3. MIN() & MAX() : Les valeurs extrêmes

Description : Les fonctions MIN() et MAX() te permettent de trouver respectivement la plus petite et la plus grande valeur au sein d’une colonne. Elles sont idéales pour identifier les extrêmes dans tes données : le minimum et le maximum d’un indicateur. Que ce soit la plus petite vente réalisée ou la plus grosse commande jamais enregistrée, ces fonctions te le dévoilent en un clin d’œil.

Quand les utiliser ? Dès que tu as besoin de connaître un extrême. Par exemple, MIN(Ventes[Montant]) retournerait le plus faible montant de vente dans ta table Ventes, et MAX(Ventes[Montant]) le plus élevé. Elles sont souvent utilisées en tandem pour donner une idée de l’échelle et de la dispersion des valeurs.

Exemple concret :
Tu gères un suivi des ventes et tu souhaites afficher le record de la plus grosse vente ainsi que la plus petite vente effectuées sur une période. Tu peux créer deux mesures :

daxCopierPlus Petite Vente = MIN(Ventes[Montant])
Plus Grosse Vente = MAX(Ventes[Montant])

Ensuite, sur un tableau de bord, affiche par exemple la Plus Grosse Vente accompagnée d’un emoji de trophée 🏆 pour signaler un record, et la Plus Petite Vente avec un symbole plus discret (par exemple une flèche vers le bas 📉) pour contraster. Cela donne immédiatement une idée des transactions extrêmes réalisées.

Cas d’usage pratiques :

  • Trouver la date la plus récente et la date la plus ancienne dans un historique (ex : dernières et premières dates de transaction).
  • Identifier le prix le plus élevé et le prix le plus bas parmi une liste de produits vendus.
  • Repérer la valeur minimale et maximale d’un capteur ou d’un indicateur de performance (utile en IoT ou en suivi de métriques diverses).

4. COUNTROWS() : Compter le nombre de lignes

Description : La fonction COUNTROWS() fait exactement ce que son nom suggère : elle compte le nombre de lignes d’une table (ou d’une table filtrée). C’est très pratique pour savoir combien d’enregistrements répondent à un certain critère, ou tout simplement pour compter le nombre total d’éléments dans une table. En d’autres termes, c’est ton outil de comptage général dans Power BI.

Quand l’utiliser ? À chaque fois que tu veux compter des occurrences. Si tu as une table Ventes, COUNTROWS(Ventes) te donnera le nombre total de transactions. Mais la vraie puissance de COUNTROWS se révèle quand tu l’utilises en combinaison avec des filtres (par exemple dans un CALCULATE ou avec une table filtrée via la fonction FILTER). Tu peux alors compter seulement les lignes qui t’intéressent.

Exemple concret :
Imaginons que tu souhaites compter le nombre de ventes réalisées dans une catégorie de produits spécifique (disons la catégorie « Électronique »). Tu peux créer une mesure :

daxCopierNb Ventes Électronique = COUNTROWS(
    FILTER(Ventes, Ventes[Catégorie] = "Électronique")
)

Cette mesure va filtrer la table Ventes pour ne garder que les lignes où la catégorie est « Électronique », puis compter ces lignes. Le résultat te donnera le nombre de transactions pour l’électronique. Tu pourras ainsi comparer le volume de ventes de chaque catégorie de produit en utilisant plusieurs mesures du même type (ou en utilisant CALCULATE, cf. la formule #9 plus bas).

Cas d’usage pratiques :

  • Compter le nombre total de transactions ou d’enregistrements dans une table de faits.
  • Compter le nombre de ventes correspondant à un filtre donné (par produit, par région, par vendeur, etc.).
  • Déterminer le nombre d’éléments restants après avoir appliqué divers filtres (par exemple, combien de clients restent actifs après filtrage par une condition).

5. DISTINCTCOUNT() : Compter les éléments uniques

Description : Besoin de compter des éléments uniques dans tes données ? DISTINCTCOUNT() est là pour ça. Cette fonction DAX compte le nombre de valeurs distinctes dans une colonne donnée. C’est extrêmement utile pour éviter de compter des doublons et obtenir un comptage exact d’éléments uniques (clients uniques, produits uniques vendus, etc.).

Quand l’utiliser ? À chaque fois que tu veux dénombrer des choses sans les compter plusieurs fois. Par exemple, DISTINCTCOUNT(Clients[ClientID]) te donnera le nombre de clients distincts (chaque client n’étant compté qu’une seule fois, peu importe le nombre d’achats qu’il a effectués). C’est parfait pour savoir combien de clients uniques ont passé commande sur ton site, plutôt que le nombre total de commandes.

Exemple concret :
Tu analyses les ventes de ton entreprise et tu veux savoir combien de produits différents ont été vendus sur l’année. En utilisant une mesure DAX du style :

daxCopierProduits Uniques Vendus = DISTINCTCOUNT(Ventes[ProduitID])

Power BI te renverra le nombre de produits distincts apparaissant dans la table des ventes. Si tu vends 100 références produits au total et qu’en 2024 tu n’en as vendu que 80, cette mesure retournera 80 (même si tu as eu des milliers de ventes, on ne compte chaque produit qu’une fois).

Cas d’usage pratiques :

  • Mesurer le nombre de clients uniques ayant effectué au moins un achat (pour évaluer la base client active).
  • Compter le nombre de produits distincts vendus sur une période (pour voir la diversité du catalogue écoulé).
  • Déterminer le nombre de jours uniques où des ventes ont eu lieu (par exemple, sur 365 jours, combien de jours actifs avec des ventes).

6. IF() : Les conditions logiques de base

Description : La fonction IF() te permet d’introduire de la logique conditionnelle dans tes formules DAX. C’est comme poser une question “Si … alors … sinon …” à tes données. Elle évalue une condition booléenne (VRAI/FAUX) et renvoie un résultat si la condition est vraie, et un autre si elle est fausse. Avec IF, tu peux créer des indicateurs qui changent de valeur en fonction de critères, un peu comme tu le ferais avec la fonction SI dans Excel.

Quand l’utiliser ? À chaque fois que tu as besoin de catégoriser ou de prendre des décisions logiques dans tes calculs. Par exemple, tu peux vouloir marquer chaque vente comme « Haute » ou « Basse » selon son montant, ou afficher un message spécial si un seuil est dépassé. IF est très utile en colonne calculée pour créer des catégories, ou en mesure pour adapter le résultat affiché.

Exemple concret :
Supposons que dans ton rapport de ventes, tu veuilles distinguer les grosses ventes des petites ventes. Tu peux ajouter une colonne calculée Catégorie Vente dans ta table Ventes avec la formule :

daxCopierCatégorie Vente = IF(Ventes[Montant] > 1000, "Grosse vente", "Petite vente")

Ainsi, chaque ligne (chaque vente) se verra attribuer la valeur « Grosse vente » si le montant dépasse 1000, sinon « Petite vente ». Tu pourras ensuite compter ou filtrer selon ces catégories, ou encore les utiliser pour colorer tes visuels.

Cas d’usage pratiques :

  • Classer les transactions en « rentables » ou « non rentables » en fonction d’un seuil de marge.
  • Afficher un avertissement (sous forme de texte ou d’icône) si un indicateur clé dépasse ou n’atteint pas une certaine valeur.
  • Choisir entre plusieurs calculs en fonction du contexte (par exemple, si aucune date n’est filtrée, afficher une valeur par défaut, sinon calculer normalement).

7. SWITCH() : Alternative à plusieurs IF imbriqués

Description : La fonction SWITCH() est une autre fonction logique qui évalue une expression par rapport à plusieurs valeurs possibles et renvoie le résultat correspondant. En clair, c’est une alternative élégante pour éviter de faire plusieurs IF imbriqués les uns dans les autres. Tu spécifies une expression (par exemple un champ catégoriel ou un numéro de mois) et ensuite différents cas de figure avec la valeur attendue pour chacun, un peu comme un menu à choix multiples.

Quand l’utiliser ? Lorsque tu as plus de deux résultats possibles à gérer. Par exemple, si tu veux attribuer une note ou une catégorie en fonction d’une valeur numérique (plusieurs tranches), ou convertir les chiffres des mois (1, 2, 3, …) en noms de mois (“Janvier”, “Février”, etc.). Plutôt que d’écrire une cascade de IF, SWITCH simplifie la lecture et l’écriture.

Exemple concret :
Imaginons que tu as un champ Note (sur 5) dans une table de feedback clients, et tu veux traduire ces notes en appréciations textuelles : 1 = « Très Mauvais », 2 = « Mauvais », …, 5 = « Excellent ». Tu peux créer une mesure ou colonne calculée Appréciation :

daxCopierAppréciation = 
SWITCH(
    Feedback[Note],
    1, "Très Mauvais",
    2, "Mauvais",
    3, "Moyen",
    4, "Bon",
    5, "Excellent",
    "Inconnu"
)

Dans cet exemple, pour chaque valeur de note, SWITCH renvoie le texte correspondant, et on prévoit même un cas par défaut « Inconnu » si la note ne correspond à aucun cas (par sécurité). C’est beaucoup plus lisible que d’enchaîner cinq IF() pour le même résultat ! 😅

Cas d’usage pratiques :

  • Convertir des codes ou chiffres en libellés compréhensibles (ex : codes de catégories vers noms, chiffres de mois vers nom du mois).
  • Créer des bandes de couleur ou de performance (par exemple, score de 0 à 3 = Rouge, 4 à 7 = Orange, 8 à 10 = Vert).
  • Gérer des calculs différents selon un type d’élément (ex : calculer une métrique différemment selon que le produit est de type A, B ou C).

8. FILTER() : Affiner un jeu de données

Description : La fonction FILTER() permet de créer une table filtrée à partir d’une autre, selon une ou plusieurs conditions. C’est un peu comme appliquer un filtre avancé sur tes données directement dans la formule. FILTER(Table, Condition) renvoie une table qui contient uniquement les lignes de Table pour lesquelles Condition est vraie. Cette fonction est très puissante combinée avec d’autres (comme on l’a vu avec COUNTROWS plus haut, ou dans un CALCULATE). Elle permet de se focaliser sur un sous-ensemble spécifique de données au sein d’une mesure.

Quand l’utiliser ? Principalement à l’intérieur d’autres fonctions qui attendent une table en argument (par exemple, dans CALCULATE pour définir un filtre, ou dans une fonction d’itération comme SUMX). Chaque fois que tu dois manipuler les données en fonction d’un critère dans une mesure, FILTER est un bon candidat. Par exemple, FILTER(Ventes, Ventes[Montant] > 100) isolera toutes les ventes dont le montant dépasse 100.

Exemple concret :
Reprenons l’exemple d’une table Clients avec un champ Âge. Si tu veux calculer le nombre de clients majeurs (18 ans ou plus), tu peux utiliser :

daxCopierClients Majeurs = COUNTROWS(
    FILTER(Clients, Clients[Âge] >= 18)
)

Ici, FILTER(Clients, Clients[Âge] >= 18) crée une table virtuelle ne contenant que les clients de 18 ans et plus, et COUNTROWS compte ces clients filtrés. Le résultat est le nombre de clients majeurs. On aurait aussi pu procéder avec un CALCULATE : l’idée est de te montrer que FILTER sert à isoler un jeu de données sur lequel appliquer ensuite une autre fonction.

Cas d’usage pratiques :

  • Créer une mesure de ventes filtrées (par exemple, ventes dont la quantité > 1, ventes d’une région spécifique, etc.).
  • Obtenir un sous-ensemble de données pour un calcul d’indicateur précis (ex : calculer la moyenne uniquement sur un certain segment de clients).
  • Exclure certaines valeurs avant un calcul (par ex, ignorer les données aberrantes en appliquant un filtre du type Valeur < X).

9. CALCULATE() : La baguette magique du contexte

Description : CALCULATE() est souvent considérée comme la formule DAX la plus puissante et importante 🔮. Pourquoi ? Parce qu’elle permet de modifier le contexte d’évaluation d’une mesure en y appliquant des filtres ou des modifications de filtres. En d’autres termes, CALCULATE prend une expression (une mesure ou un calcul) et change l’environnement dans lequel ce calcul est évalué. C’est ainsi que tu peux, par exemple, calculer un total de ventes pour une région ou une période donnée sans avoir à filtrer manuellement ton visuel : le filtre est dans la formule !

Quand l’utiliser ? Dès que tu as besoin d’un calcul conditionnel dans une mesure. CALCULATE s’utilise toujours pour retourner un scalaire (un nombre, une valeur unique) et non une table. Par exemple, CALCULATE(SUM(Ventes[Montant]), Ventes[Catégorie] = "Électronique") va évaluer la somme des montants de vente, mais dans le contexte filtré où la catégorie = « Électronique ». Tu obtiens ainsi le total des ventes Électronique, quelle que soit la sélection courante de ton rapport.

Exemple concret :
Imaginons un tableau de bord où tu souhaites afficher le total des ventes de l’année en cours à côté du total des ventes de l’année précédente, pour comparer. Tu peux avoir une mesure Ventes Cette Année = SUM(Ventes[Montant]) (filtrée par l’année en cours via le segment de date du rapport par exemple), et créer une mesure Ventes Année Précédente :

daxCopierVentes Année Précédente = 
CALCULATE(
    SUM(Ventes[Montant]), 
    YEAR(Ventes[Date]) = YEAR(TODAY()) - 1
)

Ici, CALCULATE prend la somme des montants et modifie le contexte de filtre de l’année pour l’année précédente (par rapport à la date du jour). Le résultat est le total des ventes de l’an passé, que tu peux comparer à celui de cette année. Sans CALCULATE, tu aurais du mal à obtenir cette valeur dans le même visuel sans bidouiller les filtres. Avec CALCULATE, c’est fluide !

Cas d’usage pratiques :

  • Calculer une mesure avec condition (ex : total des ventes d’une catégorie spécifique, moyenne d’un type de client particulier, etc.).
  • Réaliser des comparaisons temporelles (ventes l’an dernier, nombre d’abonnés le mois précédent, etc., en modifiant le filtre de date).
  • Appliquer des filtres complexes ou multiples dans une même mesure (ex : somme des ventes pour une catégorie donnée ET une région donnée).

10. ALL() : Ignorer les filtres pour une vue globale

Description : La fonction ALL() est un peu spéciale : elle renvoie toutes les lignes d’une table ou toutes les valeurs d’une colonne, en ignorant tout filtre qui pourrait être appliqué sur cette table ou colonne dans le contexte courant. Dit autrement, ALL supprime les filtres sur le champ ou la table que tu lui passes. Pourquoi faire ça ? Souvent pour calculer un total global ou un ratio par rapport à un total, indépendamment des filtres de l’utilisateur.

Quand l’utiliser ? ALL est principalement utilisée au sein de CALCULATE ou dans des mesures pour obtenir des totaux non filtrés. Par exemple, CALCULATE(SUM(Ventes[Montant]), ALL(Ventes)) te donnerait le total des ventes toutes catégories et toutes régions confondues, même si ton visuel est filtré sur une catégorie spécifique. C’est donc très utile pour calculer des pourcentages du total, ou afficher une valeur de référence globalement.

Exemple concret :
Tu veux afficher la part de marché d’une catégorie de produit dans le total des ventes. Tu as déjà une mesure Ventes Catégorie X (par exemple via un CALCULATE filtrant une catégorie). Pour obtenir le total de toutes les ventes (peu importe les filtres), tu crées une mesure Ventes Totales Globales :

daxCopierVentes Totales Globales = CALCULATE(SUM(Ventes[Montant]), ALL(Ventes))

Cette mesure te donne le chiffre d’affaires total sans aucun filtre. Ensuite, ta part de marché pour la catégorie X peut être calculée en faisant DIVIDE( [Ventes Catégorie X], [Ventes Totales Globales] ). Grâce à ALL, tu es sûr que le dénominateur représente bien le total complet et non pas seulement le total filtré à la catégorie. 💡

Cas d’usage pratiques :

  • Calculer des pourcentages du total (part de marché, part d’un segment dans le total, etc.) en conservant un total de référence constant.
  • Afficher des valeurs de référence globales à côté de valeurs filtrées (ex : total annuel vs valeur pour un mois spécifique).
  • Comparer un élément filtré à l’ensemble (ex : ventes d’une région donnée vs ventes mondiales).

11. RELATED() : Récupérer une valeur d’une table liée

Description : La fonction RELATED() te permet d’accéder à une valeur dans une autre table qui est liée par une relation dans le modèle de données. En quelque sorte, c’est le VLOOKUP (RECHERCHEV) du monde DAX, sauf qu’ici tu as déjà défini une relation entre tes tables dans Power BI. RELATED() s’utilise généralement dans une colonne calculée (ou parfois dans une mesure) pour faire remonter une information d’une table de dimension vers une table de faits (par exemple, récupérer la catégorie d’un produit directement dans la table des ventes).

Quand l’utiliser ? Chaque fois que tu as besoin d’une donnée se trouvant dans une table liée à celle sur laquelle tu travailles. Par exemple, si tu es dans la table Ventes et qu’elle est reliée à une table Produits (via un champ ProduitID commun), alors RELATED(Produits[PrixUnitaire]) te permettrait de ramener le prix unitaire du produit pour chaque ligne de vente. C’est super utile pour éviter de devoir jongler entre plusieurs tables dans tes visuels : tu enrichis ta table de faits avec des attributs utiles depuis les tables de dimension.

Exemple concret :
Tu disposes d’une table Ventes contenant un ProductID, mais ni le nom ni la catégorie du produit (ces infos étant dans la table Produits liée). Tu veux créer un tableau de bord des ventes par catégorie de produit. Plutôt que de toujours devoir lier les deux tables dans chaque visuel, tu peux ajouter une colonne calculée Catégorie Produit dans la table Ventes :

daxCopierCatégorie Produit = RELATED(Produits[Catégorie])

Grâce à RELATED, chaque vente hérite de la catégorie de produit correspondante. Tu peux alors facilement faire un visuel (un graphique, un tableau) des ventes par catégorie en n’utilisant que la table Ventes enrichie. Cela simplifie l’analyse et te fait gagner du temps. ⏱️

Cas d’usage pratiques :

  • Ajouter des attributs descriptifs à une table de transactions (ex : apporter le nom du client dans une table de ventes via la relation avec la table Clients).
  • Éviter d’avoir à joindre manuellement des tables dans un visuel en copiant les infos nécessaires via des colonnes calculées.
  • Simplifier l’écriture de mesures en rendant disponible dans la même table toutes les colonnes nécessaires au calcul (en amont, via des RELATED).

12. SELECTEDVALUE() : Obtenir la valeur filtrée sélectionnée

Description : SELECTEDVALUE() est une fonction très pratique pour récupérer la valeur d’un filtre (généralement à partir d’un segment, d’un slicer ou d’un contexte de ligne dans un visuel) lorsqu’il n’y a qu’une seule valeur possible. En gros, si une seule valeur est sélectionnée dans un champ, SELECTEDVALUE(Champ) te la renvoie. Si aucune valeur ou plusieurs valeurs sont sélectionnées, tu peux définir un résultat alternatif (souvent BLANK() ou une chaîne comme « Tous »). Cela permet de créer des mesures qui s’adaptent dynamiquement à la sélection de l’utilisateur.

Quand l’utiliser ? Principalement dans des mesures liées à l’interactivité du rapport. Par exemple, si tu souhaites afficher le nom d’un produit sélectionné par l’utilisateur (via un slicer) dans le titre d’un graphique ou dans une carte, SELECTEDVALUE(Produits[Nom]) te renverra ce nom dès lors qu’un seul produit est sélectionné. C’est aussi utilisé pour adapter des calculs : par ex, si une seule année est filtrée, utilise-la, sinon prends la dernière année disponible.

Exemple concret :
Tu construis un rapport dans lequel l’utilisateur peut sélectionner un client via un filtre (slicer). Tu veux afficher un texte du genre « Détail des ventes pour le client X » en titre d’un visuel, où X est le nom du client choisi. Tu peux créer une mesure Client Sélectionné :

daxCopierClient Sélectionné = SELECTEDVALUE(Clients[Nom], "Tous les clients")

Si l’utilisateur sélectionne un client dans le slicer, la mesure renverra le nom du client ; s’il n’y a pas de sélection (ou plusieurs), elle renverra « Tous les clients ». Tu peux ensuite insérer cette mesure dans un objet texte pour qu’il affiche dynamiquement le nom. 🧑‍💼

Cas d’usage pratiques :

  • Afficher un titre dynamique ou une annotation dans un rapport en fonction d’une sélection (ex : « Chiffre d’affaires pour 2019 » si l’année 2019 est sélectionnée, sinon « Chiffre d’affaires Toutes années« ).
  • Adapter une mesure en fonction d’un filtre unique (par ex, si un seul produit est sélectionné, afficher son détail, sinon un total global).
  • Créer une logique conditionnelle où le comportement change s’il y a une seule valeur filtrée ou plusieurs (SELECTEDVALUE renvoie BLANK s’il y a plusieurs valeurs, ce qui peut servir de test).

13. SUMX() : Somme avec calcul sur chaque ligne (itérateur)

Description : La fonction SUMX() est ce qu’on appelle une fonction d’itération en DAX. Contrairement à SUM() qui se contente d’additionner les valeurs existantes d’une colonne, SUMX va parcourir chaque ligne d’une table, évaluer une expression pour chaque ligne, puis faire la somme de toutes ces évaluations. Autrement dit, tu peux faire la somme de quelque chose qui n’existe pas directement dans tes données, en le calculant “à la volée” pour chaque enregistrement.

Quand l’utiliser ? Dès que tu as besoin de sommer un calcul qui implique plusieurs colonnes ou une expression. Un cas classique : tu as dans ta table Ventes une colonne Quantité et une colonne PrixUnitaire, mais pas de colonne Montant (Quantité * Prix). Plutôt que d’ajouter une colonne calculée Montant, tu peux directement créer une mesure SUMX(Ventes, Ventes[Quantité] * Ventes[PrixUnitaire]) qui multiplie quantités et prix pour chaque vente, puis additionne le tout. SUMX est également utile pour des calculs plus complexes comme des sommes pondérées, ou lorsqu’on ne peut pas juste utiliser un SUM simple.

Exemple concret :
Tu veux connaître le chiffre d’affaires total de ta boutique sans créer de colonne calculée. Ta table Ventes a ces colonnes : ProduitID, Quantité, PrixUnitaire, etc. La formule DAX en mesure serait :

daxCopierTotal CA = SUMX(Ventes, Ventes[Quantité] * Ventes[PrixUnitaire])

Ici, SUMX va prendre chaque vente, calculer Quantité * PrixUnitaire (le chiffre d’affaires de la ligne) puis sommer tous ces résultats. Le bénéfice c’est que tu calcules à la volée, et tu pourrais même complexifier l’expression (par ex, Quantité * PrixUnitaire * (1 - Remise) si tu as une remise par ligne). Le résultat final est identique à un SUM classique si tu avais eu une colonne Montant, mais tu n’as pas eu besoin de l’ajouter physiquement dans tes données.

Cas d’usage pratiques :

  • Calculer un total pondéré (ex : somme des scores * coefficients, somme des prix * quantités comme vu ci-dessus, etc.).
  • Agréger des données après un calcul par ligne (ex : somme des marges par transaction si la marge par transaction n’est pas stockée directement).
  • Effectuer des calculs complexes ligne par ligne avant agrégation (ex : SUMX(FILTER(Table, Condition), Expression) pour sommer seulement certaines lignes avec une expression spécifique).

14. AVERAGEX() : Moyenne avec calcul sur chaque ligne

Description : Dans la lignée de SUMX, la fonction AVERAGEX() est une fonction d’itération qui calcule une expression pour chaque ligne d’une table, puis renvoie la moyenne de ces valeurs. En d’autres termes, elle te permet de calculer une moyenne sur un ensemble de valeurs calculées, et pas uniquement sur une colonne existante.

Quand l’utiliser ? Quand une simple moyenne ne suffit pas parce que tu dois calculer quelque chose pour chaque cas avant d’en faire la moyenne. Par exemple, si tu veux la moyenne de (PrixUnitaire + Taxe) pour des produits, tu pourrais faire AVERAGEX(Produits, Produits[PrixUnitaire] + Produits[Taxe]). Un cas concret fréquent est la moyenne pondérée : parfois la vraie moyenne d’un indicateur doit tenir compte d’un poids (ex : calculer la moyenne de la note d’un examen où chaque section a un coefficient différent). AVERAGEX te permettrait de multiplier chaque note par son coefficient, de tout sommer et de diviser par la somme des coefficients, le tout en une formule.

Exemple concret :
Imaginons que tu souhaites calculer la marge bénéficiaire moyenne par vente. Ta table Ventes ne stocke pas directement la marge par transaction, mais tu peux la calculer (par ex, PrixVente – Coût). Tu peux créer une mesure :

daxCopierMarge Moyenne = AVERAGEX(Ventes, Ventes[PrixVente] - Ventes[Coût])

Cette formule va calculer la marge de chaque vente (PrixVente - Coût pour chaque ligne) puis faire la moyenne de toutes ces marges. Tu obtiens ainsi la marge moyenne par transaction. C’est plus précis qu’une marge globale (somme des marges / nombre de ventes) si tu as besoin de comprendre la marge typique par opération individuelle.

Cas d’usage pratiques :

  • Calculer des moyennes pondérées (ex : moyenne des notes avec coefficients, moyenne des prix pondérée par les volumes de vente, etc.).
  • Obtenir une moyenne sur une plage calculée (ex : moyenne de la variation jour par jour sur un mois, en calculant chaque variation puis la moyenne).
  • Tout scénario où tu dois calculer puis moyenner (si tu peux sommer et diviser manuellement tu obtiendras le même résultat, mais AVERAGEX te permet de le faire directement sur une étape).

15. DIVIDE() : Division en toute sécurité

Description : La fonction DIVIDE() est une petite formule bien pratique pour effectuer une division tout en gérant le cas problématique de la division par zéro. En effet, DIVIDE(x, y, [valeur_alternative]) renvoie x / y si y n’est pas zéro, mais si y = 0 (ou est BLANK/nul), au lieu de renvoyer une erreur, ça renverra BLANK() ou la valeur alternative que tu auras spécifiée. En clair, ça évite les mauvaises surprises et les erreurs dans tes visuels lorsque le dénominateur est nul.

Quand l’utiliser ? Dès que tu fais une division dans une mesure DAX. C’est souvent considéré comme une bonne pratique d’utiliser DIVIDE plutôt que l’opérateur “/” car tu contrôles le résultat en cas de zéro. Par exemple, pour calculer un taux de conversion = nombre de ventes / nombre de visites, tu écrirais DIVIDE( [Nb Ventes], [Nb Visites], 0 ) ainsi si Nb Visites est 0, le résultat renvoyé sera 0 (plutôt qu’une erreur ou un infini).

Exemple concret :
Tu as une mesure Panier Moyen qui est définie comme Total des Ventes / Nombre de Commandes. En DAX pur tu pourrais écrire [Total Ventes] / [Nb Commandes]. Mais si aucune commande n’est recensée sur une période (par exemple pas de ventes ce jour-là), Nb Commandes = 0 et ton rapport afficherait une erreur. En utilisant :

daxCopierPanier Moyen = DIVIDE( [Total Ventes], [Nb Commandes], 0 )

tu t’assures que si Nb Commandes est 0, le Panier Moyen affichera 0 (ou tu aurais pu mettre BLANK() comme troisième argument pour afficher une case vide). Résultat : ton rapport reste propre et compréhensible, sans erreurs. 👍

Cas d’usage pratiques :

  • Calculer des ratios et pourcentages (taux de conversion, ratio financier, etc.) en évitant les divisions par zéro (par ex, aucune dépense pour 0 revenu ou inversement).
  • Tout calcul du type X / Y où Y peut parfois être nul ou manquant (ex : vitesse moyenne = distance / temps, mais si temps = 0… mieux vaut prévoir).
  • Simplifier la lecture des formules en remplaçant IF(y=0, BLANK(), x/y) par un simple DIVIDE(x, y) plus concis et élégant.

16. CONCATENATEX() : Assembler des valeurs textuelles

Description : CONCATENATEX() est une fonction DAX très utile pour concaténer (fusionner) des valeurs textuelles à travers plusieurs lignes, en les séparant par un délimiteur de ton choix. En gros, elle parcourt une table ou un groupe de lignes, prend la valeur texte d’une colonne pour chaque ligne, et les assemble en une seule chaîne de caractères avec, par exemple, une virgule ou un espace entre chaque. C’est parfait pour créer des listes à partir de plusieurs enregistrements.

Quand l’utiliser ? Quand tu veux afficher ou utiliser une liste de valeurs textuelles agrégées. Par exemple, lister tous les produits vendus dans une commande, ou lister les villes dans lesquelles une entreprise est présente, dans une seule phrase. CONCATENATEX(Table, Table[ColonneTexte], ", ") retournera une chaîne contenant toutes les valeurs de ColonneTexte séparées par des virgules. Attention, s’il y a beaucoup de valeurs, ça peut faire une longue liste, mais pour un usage raisonnable c’est très pratique.

Exemple concret :
Tu as une table Commandes et une table Produits reliées (une commande peut avoir plusieurs produits). Tu veux créer un texte qui liste tous les produits d’une commande pour affichage. Avec une mesure (ou une colonne calculée) du genre :

daxCopierProduits de la Commande = 
CONCATENATEX(
    RELATEDTABLE(Produits), 
    Produits[Nom], 
    ", "
)

Pour chaque commande, RELATEDTABLE(Produits) récupère les produits liés, puis CONCATENATEX assemble leurs noms séparés par une virgule. Ainsi, pour une commande donnée, tu obtiendras un texte du style « Produit A, Produit B, Produit C » si trois produits y sont associés. Génial pour afficher des détails lisibles dans un tooltip ou un rapport ! 📝

Cas d’usage pratiques :

  • Afficher la liste des éléments associés à un enregistrement (ex : liste des produits dans une commande, liste des compétences d’un employé, etc.).
  • Créer des étiquettes de texte pour des visuels avancés (ex : combiner ville et pays en une seule ligne “Paris, France” pour une carte).
  • Regrouper des identifiants ou des noms dans un champ unique à titre d’information (par ex : toutes les références d’un client s’il en a plusieurs, rassemblées en une seule chaîne).

17. RANKX() : Classer et donner un rang

Description : La fonction RANKX() est utilisée pour classer des éléments en fonction d’une mesure ou d’une expression que tu définis. Elle va attribuer un rang (1er, 2ème, 3ème, …) à chaque élément d’une table en fonction de la valeur de l’expression, généralement de manière décroissante (le plus grand premier) ou croissante. C’est idéal pour créer des classements dynamiques : top 10 produits, classement de performances, etc.

Quand l’utiliser ? Quand tu as un besoin de classement relatif. Par exemple, tu veux afficher la position d’un produit par rapport aux autres en fonction des ventes. Avec RANKX, tu vas comparer la valeur de ventes de chaque produit aux autres et obtenir son rang. Elle s’utilise généralement dans une mesure, souvent combinée avec un filtre sur le contexte (par exemple, tous les produits, ou tous les clients).

Exemple concret :
Supposons que tu disposes d’une mesure Total Ventes par produit. Tu peux créer une mesure Rang du Produit :

daxCopierRang du Produit = 
RANKX(
    ALL(Produits[Nom]), 
    [Total Ventes], 
    , 
    DESC, 
    Skip
)

Ici, RANKX va classer chaque produit parmi tous les produits (ALL(Produits[Nom]) enlève les éventuels filtres sur les produits) en se basant sur la mesure [Total Ventes]. Le paramètre DESC indique qu’on classe du plus grand au plus petit, et Skip spécifie comment gérer les ex æquo (on peut aussi utiliser Dense pour ne pas sauter de rang en cas d’égalité, etc.). Le résultat, pour un produit donné, sera par exemple 5 s’il est le 5ème plus gros vendeur. Tu pourras alors afficher ce rang dans un tableau à côté du produit ou mettre en avant le top 1. 🥇

Cas d’usage pratiques :

  • Créer un top 10 (ou top N) dynamique en utilisant le rang et en filtrant les éléments dont le rang est <= 10.
  • Afficher la position d’un élément dans un classement (ex : la position d’une région en termes de chiffre d’affaires par rapport aux autres régions).
  • Suivre l’évolution d’un rang dans le temps (par ex, voir si un produit est monté ou descendu dans le classement des ventes de mois en mois en calculant son rang chaque mois).

18. DATEADD() : Naviguer dans le temps (intelligence temporelle)

Description : DATEADD() est une fonction de time intelligence très utile pour manipuler les dates dans des calculs. Elle prend une colonne de dates et te renvoie une colonne de dates décalées d’un intervalle que tu spécifies. Par exemple, DATEADD(Calendrier[Date], -1, YEAR) te renvoie la date correspondante un an en arrière pour chaque date du contexte. Utilisée dans un CALCULATE, c’est parfait pour comparer des périodes (N vs N-1, etc.). Note : pour exploiter au mieux DATEADD et les fonctions temporelles, il te faut une table calendrier dans ton modèle de données.

Quand l’utiliser ? Lorsque tu veux créer des mesures comme « par rapport à l’année précédente », « même période l’an dernier » (ou mois précédent, trimestre précédent, etc.). Par exemple, CALCULATE([Mesure], DATEADD(Calendrier[Date], -1, YEAR)) te permet de calculer la mesure pour l’année précédente dans le contexte actuel. C’est plus simple que de bricoler avec des conditions sur les années.

Exemple concret :
Tu as une mesure Ventes (total des ventes courantes). Tu veux une mesure Ventes Année Précédente sans refaire toute la logique à la main. Tu peux écrire :

daxCopierVentes Année Précédente = 
CALCULATE(
    [Ventes], 
    DATEADD(Calendrier[Date], -1, YEAR)
)

Ici, on utilise DATEADD pour décaler le filtre de date d’un an en arrière, et CALCULATE pour évaluer la mesure [Ventes] dans ce contexte modifié. Ensuite, dans un visuel, tu peux comparer côte à côte Ventes et Ventes Année Précédente, ou calculer l’évolution en pourcentage. 📉📈 Cela rend extrêmement facile la création de rapports comparatifs temporels (année en cours vs année précédente, etc.).

Cas d’usage pratiques :

  • Comparer les ventes d’une année à l’autre (ou mois à mois, trimestre à trimestre) en utilisant une mesure décalée dans le temps.
  • Créer des indicateurs du type « à la même période l’an dernier » automatiquement grâce à la table calendrier.
  • Construire des analyses de tendance où tu as besoin des valeurs décalées (précédentes ou suivantes) pour calculer des évolutions.

19. TOTALYTD() : Cumul d’une mesure depuis le début d’année

Description : TOTALYTD() (Total Year-To-Date) est une fonction pratique de DAX qui calcule le cumul d’une mesure depuis le début de l’année jusqu’à la date courante du contexte. En clair, c’est un moyen rapide d’obtenir une valeur cumulative annuelle sans avoir à écrire une formule complexe. Cette fonction prend en argument une expression (typiquement une mesure d’agrégation comme SUM) et une colonne de dates, et elle additionne la valeur de l’expression du 1er janvier jusqu’à chaque date du contexte.

Quand l’utiliser ? Quand tu veux afficher un cumul progressif sur l’année (ou sur une autre période, il existe aussi TOTALQTD pour Quarter-to-date, TOTALMTD pour Month-to-date). Par exemple, pour afficher les ventes cumulées au fil des mois de l’année en cours. Avec TOTALYTD, pas besoin de faire une formule avec des filtres de dates, c’est géré en interne si tu as une table Calendrier correctement reliée.

Exemple concret :
Tu as une mesure Total Ventes = SUM(Ventes[Montant]). Pour obtenir le cumul des ventes depuis le début de l’année jusqu’à chaque date, il suffit de :

daxCopierVentes Cumulées YTD = TOTALYTD( [Total Ventes], Calendrier[Date] )

Si tu mets cette mesure dans un graphique avec les mois de l’année, tu verras la courbe cumulative qui monte mois après mois. En janvier, c’est égal aux ventes de janvier; en février, c’est janvier+février; etc. C’est très utile pour suivre l’atteinte d’un objectif annuel par exemple (tu peux comparer à la courbe cible, etc.). 🎯

Cas d’usage pratiques :

  • Suivre l’évolution cumulée d’un indicateur sur l’année en cours (ventes, dépenses, nombre de clients acquis, etc.).
  • Comparer le cumul de l’année en cours avec le cumul à la même date l’année précédente (en combinant TOTALYTD et DATEADD par exemple).
  • Créer rapidement des mesures de YTD (Year-to-date), QTD (Quarter-to-date), MTD (Month-to-date) pour des dashboards financiers ou de performance.

20. ALLEXCEPT() : Garder certains filtres, ignorer les autres

Description : Pour finir notre liste, évoquons ALLEXCEPT(). Cette fonction est une variante de ALL qui permet de supprimer tous les filtres sauf ceux sur certaines colonnes spécifiées. En d’autres termes, ALLEXCEPT(Table, Table[Colonne1], Table[Colonne2], …) enlève tous les filtres sur la table sauf ceux sur Colonne1, Colonne2, etc. C’est très utile quand tu veux calculer un total ou un ratio global en conservant une segmentation particulière.

Quand l’utiliser ? Lorsque tu calcules par exemple un pourcentage du total au sein d’une catégorie. Imaginons que tu veuilles le pourcentage des ventes d’un produit par rapport au total de sa catégorie. Si tu utilises ALL(Produits), tu obtiens le total global tous produits confondus. Mais en utilisant ALLEXCEPT(Produits, Produits[Catégorie]), tu obtiens le total de la catégorie (tous filtres sur les produits sont ignorés sauf le filtre sur la catégorie elle-même). C’est donc parfait pour faire des parts de sous-ensemble cohérentes.

Exemple concret :
Tu as un visuel qui affiche les ventes par produit au sein d’une catégorie. Tu veux ajouter une mesure Part dans Catégorie pour chaque produit. Tu peux calculer le total par catégorie avec :

daxCopierVentes Catégorie = CALCULATE( [Total Ventes], ALLEXCEPT(Produits, Produits[Catégorie]) )

Puis la part de chaque produit = [Total Ventes] / [Ventes Catégorie]. Ici, ALLEXCEPT fait en sorte que dans le calcul de Ventes Catégorie, on ignore le filtre sur le produit lui-même (donc on prend tous les produits), mais on garde le filtre sur la catégorie courante. Résultat : on obtient bien le total de la catégorie correspondante. Ainsi, chaque produit peut se comparer au total de sa catégorie. 📊

Cas d’usage pratiques :

  • Calculer des parts de marché internes (un élément par rapport au total de son segment, plutôt qu’au total global).
  • Conserver un certain niveau de filtre tout en enlevant les autres pour un calcul (ex : total par région en gardant l’année filtrée, etc.).
  • Toute situation où ALL serait trop large car tu veux préserver un contexte particulier pendant le calcul.

Conclusion : Prêt à plonger plus loin dans DAX ! 🎓

Bravo 🙌, tu viens de parcourir les 20 formules DAX essentielles pour bien débuter sur Power BI !

Ce voyage à travers les fonctions de base t’a montré comment additionner, moyenniser, filtrer, comparer et manipuler tes données de multiples façons. Grâce à ces formules, tu disposes d’un arsenal de base pour analyser tes données efficacement et créer des rapports dynamiques et instructifs.

N’oublie pas que la maîtrise de DAX vient avec la pratique. 💪

Maintenant que tu connais ces formules, entraîne-toi à les utiliser dans tes propres modèles de données. Commence par des exemples simples, puis complexifie progressivement les scénarios.

Essaie de combiner ces fonctions entre elles (par exemple, CALCULATE avec FILTER et ALL, ou IF avec des mesures calculées) pour voir toute la puissance du langage DAX dans Power BI.

Pour aller plus loin, tu peux explorer des fonctions DAX plus avancées, comme les fonctions de temps supplémentaires (PARALLELPERIOD, SAMEPERIODLASTYEAR, etc.), les fonctions d’information (ISBLANK, HASONEVALUE…), ou encore te plonger dans la documentation officielle Microsoft et les nombreux tutoriels en ligne. C

haque nouvelle formule que tu apprendras viendra enrichir ta boîte à outils d’analyste.

En cas de doute ou de blocage, n’hésite pas à rejoindre la communauté des utilisateurs de Power BI (sur les forums, LinkedIn, etc.) 🤝 : elle regorge de personnes prêtes à s’entraider et à partager des astuces sur DAX.

En attendant, avec ces 20 formules essentielles, tu as déjà de quoi faire des merveilles dans tes rapports. Alors, à toi de jouer ! 🚀 Bonne analyse de données avec Power BI et les formules DAX !
Enfin, si tu recherches 10 astuces sur Power BI que même les pros ne connaissent pas toujours, n’hésite pas à consulter notre article.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *