Formules DAX que tout utilisateur professionnel devrait connaître

Maîtrisez 20 formules DAX essentielles pour Power BI. CALCULATE, intelligence temporelle, RANKX, transition de contexte, itérateurs et exemples commerciaux pratiques.

E
ECOSIRE Research and Development Team
|17 mars 202617 min de lecture3.9k Mots|

Fait partie de notre série Data Analytics & BI

Lire le guide complet

Formules DAX que tout utilisateur professionnel devrait connaître

DAX (Data Analysis Expressions) est le langage de formule qui transforme Power BI d'un simple outil graphique en un moteur analytique à part entière. Alors que l'interface glisser-déposer de Power BI gère les agrégations de base, la véritable business intelligence nécessite DAX. Les comparaisons d'une année sur l'autre, les moyennes mobiles, les classements, les scénarios de simulation et les KPI complexes dépendent tous des formules DAX.

Le défi est que DAX semble d’une simplicité trompeuse mais se comporte d’une manière qui surprend même les utilisateurs Excel expérimentés. Les concepts de contexte de filtre, de contexte de ligne et de transition de contexte sont propres à DAX et n'ont pas d'équivalent direct dans Excel ou SQL. Ce guide se concentre sur les 20 formules DAX les plus pratiques pour les utilisateurs professionnels, avec des exemples concrets que vous pouvez adapter immédiatement.


Points clés à retenir

  • CALCULATE est la fonction DAX la plus importante --- elle modifie le contexte du filtre et est utilisée dans plus de 80 % des mesures non triviales
  • Les fonctions d'intelligence temporelle (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) nécessitent une table de date appropriée marquée comme telle dans le modèle
  • La syntaxe VAR/RETURN rend lisibles les mesures complexes et évite les calculs redondants
  • Les fonctions itératrices (SUMX, AVERAGEX, RANKX) évaluent les expressions ligne par ligne, tandis que les agrégateurs (SUM, AVERAGE) opèrent sur les colonnes
  • La transition de contexte se produit lorsqu'une colonne calculée ou un itérateur appelle une mesure, convertissant le contexte de ligne en contexte de filtre
  • SWITCH(TRUE(), ...) remplace les instructions IF imbriquées et est bien plus lisible
  • ALL, ALLEXCEPT et REMOVEFILTERS contrôlent quels filtres sont actifs --- mais soyez prudent avec les implications RLS

Foundation : Contexte de filtre et contexte de ligne

Avant de se plonger dans les formules, il est essentiel de comprendre ces deux concepts. Chaque confusion dans DAX remonte au contexte de filtre et au contexte de ligne.

Filtrer le contexte

Le contexte de filtre est l'ensemble des filtres appliqués à un calcul. Il provient de slicers, de filtres visuels, de filtres de pages, de filtres de rapports et de RLS. Lorsque vous placez une mesure dans un visuel matriciel avec « Année » sur les lignes et « Région » sur les colonnes, chaque cellule possède un contexte de filtre unique : (Année = 2025, Région = Amérique du Nord), (Année = 2025, Région = EMEA), et ainsi de suite.

Chaque fonction d'agrégation DAX (SUM, AVERAGE, COUNT, MIN, MAX) est évaluée dans le contexte de filtre actuel. SUM(Sales[Revenue]) dans une cellule filtrée sur 2025 + Amérique du Nord additionne uniquement les lignes de revenus correspondant aux deux conditions.

Contexte de ligne

Le contexte de ligne existe dans les colonnes calculées et les fonctions d'itérateur. Cela signifie « la ligne actuelle ». Dans une colonne calculée de la table Sales, Sales[Revenue] * Sales[Quantity] évalue chaque ligne individuellement.

Transition de contexte

Lorsqu'une fonction itératrice (comme SUMX) appelle une mesure, le contexte de ligne est automatiquement converti en contexte de filtre. C'est ce qu'on appelle la transition de contexte. Il est puissant mais peut être source de problèmes de performances en cas de mauvaise utilisation.

-- Row context exists here (iterating over Products)
Revenue Per Product =
SUMX(
    Products,
    [Total Revenue]  -- This measure is evaluated in filter context
                     -- where the current product's ID filters the Sales table
)

Comprendre ces concepts rend chaque formule DAX intuitive. Sans eux, les formules DAX ressemblent à des boîtes noires.


Les 20 formules essentielles

1. CALCULER — Modifier le contexte du filtre

CALCULATE est la fonction DAX la plus importante. Il évalue une expression dans un contexte de filtre modifié.

Syntaxe : CALCULATE(expression, filter1, filter2, ...)

Exemple : Revenus provenant de commandes importantes uniquement

Large Order Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Sales[OrderTotal] > 10000
)

Exemple : Revenus d'une catégorie de produits spécifique

Electronics Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Products[Category] = "Electronics"
)

CALCULATE remplace le filtre existant sur la colonne spécifiée. Si un segment filtre déjà la catégorie sur « Vêtements », la mesure des revenus de l'électronique ignore ce segment et affiche les revenus de l'électronique, car CALCULATE remplace le filtre de catégorie.

2. FILTER — Filtrage au niveau des lignes

FILTER renvoie une table filtrée par une condition. Il est souvent utilisé dans CALCULATE pour un filtrage complexe qui ne peut pas être exprimé comme une simple comparaison de colonnes.

Syntaxe : FILTER(table, condition)

Exemple : Revenus des clients ayant plus de 5 commandes

Revenue From Repeat Customers =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        Customers,
        CALCULATE(COUNTROWS(Sales)) > 5
    )
)

Important : FILTER itère ligne par ligne, ce qui le rend plus lent que les simples filtres CALCULATE sur les grandes tables. Utilisez-le uniquement lorsqu'un filtre à colonne directe est insuffisant.

3. TOUS — Supprimer tous les filtres

ALL supprime tous les filtres d'une table ou d'une colonne, renvoyant la table complète non filtrée. Il est utilisé pour calculer des totaux, des pourcentages du total et des ratios.

Syntaxe : ALL(table) ou ALL(table[column])

Exemple : Revenus en pourcentage du total

Revenue % of Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)

Lorsqu'un segment filtre "Amérique du Nord", SUM(Sales[Revenue]) renvoie les revenus de l'Amérique du Nord. CALCULATE(SUM(Sales[Revenue]), ALL(Sales)) supprime tous les filtres et renvoie les revenus globaux. La division donne le pourcentage.

4. ALLEXCEPT — Supprimer tous les filtres sauf ceux spécifiés

ALLEXCEPT supprime tous les filtres d'une table à l'exception des colonnes spécifiées. Ceci est utile lorsque vous souhaitez conserver certains filtres (comme l'année) tout en en supprimant d'autres (comme la catégorie de produit).

Syntaxe : ALLEXCEPT(table, column1, column2, ...)

Exemple : partage des revenus au cours de l'année en cours

Revenue % of Year Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(
        SUM(Sales[Revenue]),
        ALLEXCEPT(Sales, DateTable[Year])
    )
)

Cela montre la part des revenus de chaque produit ou région au cours de l'année sélectionnée, et non sur toute la période.

5. TOTALYTD — Depuis le début de l'année

TOTALYTD calcule un total cumulé du début de l'année à la date du jour en contexte.

Syntaxe : TOTALYTD(expression, dates[date_column], [filter], [year_end_date])

Exemple : revenu cumulatif de l'année

Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

Avec l'exercice se terminant le 30 juin :

Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "6/30")

Prérequis : Le DateTable doit être marqué comme table de dates dans le modèle (Outils de table, puis Marquer comme table de dates).

6. SAMEPERIODLASTYEAR — Année après année

SAMEPERIODLASTYEAR décale le contexte de date d’exactement un an.

Syntaxe : SAMEPERIODLASTYEAR(dates[date_column])

Exemple : Chiffre d'affaires par rapport à l'année dernière

Revenue PY =
CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))

Revenue YoY Growth =
VAR CurrentRevenue = SUM(Sales[Revenue])
VAR PriorRevenue = [Revenue PY]
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue, 0)

Dans une matrice mensuelle, chaque ligne affiche les revenus du mois en cours et du même mois de l'année précédente, ainsi que le pourcentage de croissance.

7. DATEADD — Horaires flexibles

DATEADD décale les dates selon n'importe quel intervalle : jours, mois, trimestres ou années. Il est plus flexible que SAMEPERIODLASTYEAR.

Syntaxe : DATEADD(dates[date_column], intervals, interval_type)

Exemple : Revenus il y a 3 mois

Revenue 3 Months Ago =
CALCULATE(
    SUM(Sales[Revenue]),
    DATEADD(DateTable[Date], -3, MONTH)
)

Exemple : Revenus glissants sur 12 mois

Revenue Rolling 12M =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

8. RANKX — Classements dynamiques

RANKX attribue un classement à chaque élément en fonction d'une expression.

Syntaxe : RANKX(table, expression, [value], [order], [ties])

Exemple : Classer les produits par chiffre d'affaires

Product Revenue Rank =
RANKX(
    ALL(Products[ProductName]),
    [Total Revenue],
    ,
    DESC,
    DENSE
)

ALL(Products[ProductName]) fournit la liste complète des produits à classer, quels que soient les filtres de découpage sur les produits. DESC signifie que les revenus les plus élevés obtiennent le rang 1. DENSE signifie que les valeurs liées obtiennent le même rang.

Exemple : filtre Top N

Top 10 Products Revenue =
CALCULATE(
    [Total Revenue],
    FILTER(
        ALL(Products[ProductName]),
        RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC) <= 10
    )
)

9. COMMUTATEUR — Logique conditionnelle

SWITCH remplace les instructions IF imbriquées et est beaucoup plus lisible.

Syntaxe : SWITCH(expression, value1, result1, value2, result2, ..., else_result)

Exemple : Classification des segments de clientèle

Customer Segment =
SWITCH(
    TRUE(),
    [Total Revenue] > 100000, "Enterprise",
    [Total Revenue] > 25000, "Mid-Market",
    [Total Revenue] > 5000, "SMB",
    "Startup"
)

Exemple : sélection de mesure dynamique

Selected Measure =
SWITCH(
    SELECTEDVALUE(MeasureSelector[Measure]),
    "Revenue", [Total Revenue],
    "Orders", [Order Count],
    "AOV", [Average Order Value],
    "Margin", [Gross Margin %],
    [Total Revenue]
)

Ce modèle fonctionne avec un slicer qui permet aux utilisateurs de choisir la métrique à afficher dans un graphique.

10. VAR / RETOUR — Variables

Les variables stockent les résultats intermédiaires, rendant les formules lisibles et évitant les calculs redondants. Une variable est évaluée une fois et réutilisée.

Syntaxe : VAR name = expression RETURN final_expression

Exemple : KPI complexe avec des variables

Customer Health Score =
VAR Revenue = [Total Revenue]
VAR OrderCount = [Order Count]
VAR DaysSinceLastOrder =
    DATEDIFF(MAX(Sales[OrderDate]), TODAY(), DAY)
VAR RevenueScore =
    SWITCH(TRUE(), Revenue > 50000, 3, Revenue > 10000, 2, 1)
VAR FrequencyScore =
    SWITCH(TRUE(), OrderCount > 20, 3, OrderCount > 5, 2, 1)
VAR RecencyScore =
    SWITCH(TRUE(), DaysSinceLastOrder < 30, 3, DaysSinceLastOrder < 90, 2, 1)
RETURN
    RevenueScore + FrequencyScore + RecencyScore

Sans variables, cette formule répéterait les mêmes calculs plusieurs fois, la rendant illisible et plus lente.

11. DIVISER — Division sécurisée

DIVIDE gère la division par zéro avec élégance, renvoyant un résultat alternatif spécifié au lieu d'une erreur.

Syntaxe : DIVIDE(numerator, denominator, [alternate_result])

Exemple :

Conversion Rate =
DIVIDE([Closed Won Deals], [Total Opportunities], 0)

Utilisez toujours DIVIDE au lieu de l'opérateur / dans les mesures. L'opérateur / renvoie une erreur lors de la division par zéro, brisant vos visuels.

12. DISTINCTCOUNT — Compter les valeurs uniques

DISTINCTCOUNT compte le nombre de valeurs uniques dans une colonne.

Syntaxe : DISTINCTCOUNT(column)

Exemple : Clients actifs dans la période

Active Customers =
DISTINCTCOUNT(Sales[CustomerID])

Cela compte les clients uniques qui ont effectué au moins un achat dans le contexte de filtre actuel (mois, trimestre sélectionné, etc.).

13. COUNTROWS — Compter les lignes dans un tableau

COUNTROWS compte le nombre de lignes dans un tableau, éventuellement filtré.

Syntaxe : COUNTROWS(table)

Exemple : Les commandes comptent

Order Count =
COUNTROWS(Sales)

Cancelled Orders =
CALCULATE(
    COUNTROWS(Sales),
    Sales[Status] = "Cancelled"
)

14. SUMX — Somme ligne par ligne

SUMX est un itérateur qui évalue une expression pour chaque ligne et additionne les résultats. C'est essentiel lorsque vous devez multiplier des colonnes avant de les additionner.

Syntaxe : SUMX(table, expression)

Exemple : Calcul de la moyenne pondérée

Weighted Average Price =
DIVIDE(
    SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
    SUM(Sales[Quantity])
)

SUM ne peut pas multiplier deux colonnes. Vous avez besoin de SUMX pour évaluer la quantité multipliée par UnitPrice pour chaque ligne, puis additionner les résultats.

15. AVERAGEX — Moyenne ligne par ligne

AVERAGEX est la version itératrice de AVERAGE.

Syntaxe : AVERAGEX(table, expression)

Exemple : jours moyens pour clôturer

Average Days to Close =
AVERAGEX(
    Opportunities,
    DATEDIFF(Opportunities[CreatedDate], Opportunities[ClosedDate], DAY)
)

16. MAXX et MINX — Itérateur Min/Max

MAXX et MINX trouvent la valeur maximale ou minimale d'une expression évaluée ligne par ligne.

Exemple : Dernière date de commande par client

Most Recent Order =
MAXX(Sales, Sales[OrderDate])

Oldest Unpaid Invoice =
MINX(
    FILTER(Invoices, Invoices[PaymentStatus] = "Unpaid"),
    Invoices[InvoiceDate]
)

17. LOOKUPVALUE — Équivalent VLOOKUP

LOOKUPVALUE récupère une valeur d'une table en fonction d'un ou plusieurs critères de recherche. C'est l'équivalent DAX de VLOOKUP d'Excel.

Syntaxe : LOOKUPVALUE(result_column, search_column, search_value, ...)

Exemple :

Customer Region =
LOOKUPVALUE(
    Customers[Region],
    Customers[CustomerID], Sales[CustomerID]
)

Remarque : LOOKUPVALUE est généralement utilisé dans les colonnes calculées, et non dans les mesures. Dans les mesures, RELATED (pour plusieurs-à-un) ou RELATEDTABLE (pour un-à-plusieurs) sont préférés.

18. SELECTEDVALUE — Obtenez la valeur actuelle du slicer

SELECTEDVALUE renvoie la valeur d'une colonne lorsqu'exactement une valeur se trouve dans le contexte de filtre. Si plusieurs valeurs sont sélectionnées, il renvoie le résultat alternatif.

Syntaxe : SELECTEDVALUE(column, [alternate_result])

Exemple : titre dynamique

Chart Title =
"Revenue for " & SELECTEDVALUE(DateTable[Year], "All Years")

19. ISBLANK — Vérifier les valeurs vides

ISBLANK teste si une valeur est vide (nulle/vide).

Exemple : commandes sans vendeur assigné

Unassigned Orders =
CALCULATE(
    COUNTROWS(Sales),
    ISBLANK(Sales[SalespersonID])
)

20. CONCATENATEX — Concaténer les valeurs d'une table

CONCATENATEX parcourt une table et concatène les valeurs en une seule chaîne.

Syntaxe : CONCATENATEX(table, expression, [delimiter], [order_by], [order])

Exemple : Liste des produits achetés par un client

Products Purchased =
CONCATENATEX(
    VALUES(Products[ProductName]),
    Products[ProductName],
    ", ",
    Products[ProductName], ASC
)

Dans un tableau détaillé du client, cela affiche « Produit A, Produit B, Produit C » pour chaque client.


Analyse approfondie de l'intelligence temporelle

L’intelligence temporelle est la raison la plus courante pour laquelle les utilisateurs professionnels ont besoin de DAX. Les fonctions d'intelligence temporelle de Power BI nécessitent une table de dates dédiée. Voici un ensemble complet de mesures de temps.

Prérequis : La table des dates

Votre modèle doit avoir une table de dates avec :

  • Une colonne de date continue (sans lacunes) couvrant toute votre plage de données
  • Le tableau marqué comme tableau de dates (Outils de tableau, puis Marquer comme tableau de dates)
  • Une relation entre la colonne de date de la table de dates et la colonne de date de chaque table de faits

Mesures courantes d'intelligence temporelle

-- Month-to-Date
Revenue MTD =
TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])

-- Quarter-to-Date
Revenue QTD =
TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])

-- Year-to-Date
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

-- Previous Month
Revenue PM =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSMONTH(DateTable[Date]))

-- Previous Quarter
Revenue PQ =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSQUARTER(DateTable[Date]))

-- Previous Year
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSYEAR(DateTable[Date]))

-- Month-over-Month Growth
Revenue MoM % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PM]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Year-over-Year Growth
Revenue YoY % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PY]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Rolling 3-Month Average
Revenue 3M Avg =
AVERAGEX(
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
    CALCULATE(SUM(Sales[Revenue]))
)

-- Cumulative Total (Running Sum)
Revenue Cumulative =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        ALL(DateTable[Date]),
        DateTable[Date] <= MAX(DateTable[Date])
    )
)

Intelligence temporelle de l'année fiscale

Si votre exercice financier ne correspond pas à l'année civile, utilisez le paramètre facultatif year_end_date :

-- Fiscal Year ending March 31
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")

-- Or use DATESYTD for more control
Revenue Fiscal YTD v2 =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESYTD(DateTable[Date], "3/31")
)

Transition de contexte : le moteur caché

La transition de contexte est le processus par lequel le contexte de ligne (à partir d'une colonne calculée ou d'un itérateur) est converti en contexte de filtre lorsqu'une mesure est appelée. Il s’agit du concept le plus puissant et le plus mal compris du DAX.

Comment ça marche

Considérez cette mesure :

Total Revenue = SUM(Sales[Revenue])

Et cette colonne calculée sur la table Produits :

Product Revenue = [Total Revenue]

Dans la colonne calculée, il y a le contexte de ligne (la ligne de produit actuelle). Lorsque [Total Revenue] est appelé, la transition de contexte convertit le contexte de ligne en filtre : CALCULATE(SUM(Sales[Revenue]), Products[ProductID] = <current row's ProductID>). Le résultat est le revenu pour ce produit spécifique.

### Implications sur les performances

La transition de contexte ajoute un CALCULATE implicite autour de l'appel de mesure. Pour les petites tables, c'est négligeable. Pour les grandes tables avec des mesures complexes, cela peut coûter cher. Évitez d'appeler des mesures complexes à l'intérieur d'itérateurs sur de grandes tables.

Inefficace :

-- Iterates over every customer, calling a complex measure each time
Customer Profitability =
SUMX(
    Customers,
    [Revenue] - [COGS] - [Allocated Overhead]
)

Mieux :

-- Pre-compute the components and use simple arithmetic
Customer Profitability =
SUM(Sales[Revenue]) - SUM(Sales[COGS]) -
DIVIDE(SUM(Sales[Revenue]), [Total Revenue]) * [Total Overhead]

Scénarios commerciaux pratiques

Scénario 1 : Analyse ABC (Classification de Pareto)

Classez les produits en A (80 % des revenus supérieurs), B (15 % suivants) et C (5 % inférieurs) :

ABC Class =
VAR CurrentProduct = SELECTEDVALUE(Products[ProductName])
VAR AllProducts =
    ADDCOLUMNS(
        ALL(Products[ProductName]),
        "@Revenue", [Total Revenue]
    )
VAR Sorted = TOPN(COUNTROWS(AllProducts), AllProducts, [@Revenue], DESC)
VAR TotalRev = SUMX(AllProducts, [@Revenue])
VAR CumulativeRev =
    SUMX(FILTER(Sorted, [@Revenue] >= [Total Revenue]), [@Revenue])
VAR CumulativePct = DIVIDE(CumulativeRev, TotalRev)
RETURN
    SWITCH(TRUE(),
        CumulativePct <= 0.8, "A",
        CumulativePct <= 0.95, "B",
        "C"
    )

Scénario 2 : Analyse de la rétention des cohortes

Suivez combien de clients de chaque cohorte d’acquisition restent actifs au fil du temps :

Cohort Retention Rate =
VAR CohortMonth = SELECTEDVALUE(DateTable[YearMonth])
VAR CohortCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
VAR ActiveCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
RETURN
    DIVIDE(ActiveCustomers, CohortCustomers, 0)

Scénario 3 : Total annuel mobile (MAT)

Un total annuel mobile lisse la saisonnalité en additionnant les 12 derniers mois complets :

Revenue MAT =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

Revenue MAT Growth =
VAR Current = [Revenue MAT]
VAR Prior =
    CALCULATE(
        [Revenue MAT],
        DATEADD(DateTable[Date], -12, MONTH)
    )
RETURN
    DIVIDE(Current - Prior, Prior, 0)

Itérateur vs Agrégateur : quand les utiliser ?

Fonctions de l'agrégateur

SUM, AVERAGE, COUNT, MIN, MAX fonctionnent sur une seule colonne. Ils sont rapides car le moteur de stockage peut les résoudre directement à partir des données de colonnes compressées.

À utiliser lorsque : Vous avez besoin d'une simple agrégation d'une colonne.

Fonctions de l'itérateur

SUMX, AVERAGEX, COUNTX, MINX, MAXX, RANKX évaluent une expression ligne par ligne. Ils sont plus flexibles mais plus lents car le moteur de formule traite chaque ligne.

À utiliser quand :

  • Vous devez multiplier les colonnes avant d'agréger (SUMX pour les calculs pondérés)
  • Vous devez appliquer une condition par ligne (COUNTX avec IF)
  • Vous devez classer les éléments (RANKX)
  • Le calcul dépend des valeurs des tables associées qui nécessitent une évaluation au niveau des lignes.

Règle générale en matière de performances : Si le même résultat peut être obtenu avec un agrégateur, utilisez l'agrégateur. N'utilisez des itérateurs que lorsque l'évaluation ligne par ligne est nécessaire.


Débogage de DAX

Messages d'erreur courants

ErreurParce queCorriger
"Une seule valeur pour la colonne X est attendue"La mesure renvoie plusieurs valeurs là où une est attendueUtilisez SELECTEDVALUE, MAX ou CALCULATE pour réduire à une valeur
"Dépendance circulaire"Deux colonnes ou mesures calculées se référencent mutuellementRefonte de la chaîne de calcul pour supprimer le cycle
"Impossible de déterminer les relations"Chemin de relation ambigu entre les tablesPrécisez la relation dans USERELATIONSHIP ou activez-la
"L'expression fait référence à plusieurs colonnes"ALL/VALUES utilisé de manière incorrecte avec plusieurs colonnesUtilisez ALL(Table) ou ALL(Table[Col1], Table[Col2])

Analyseur de performances

L'Analyseur de performances de Power BI Desktop (Vue, puis Analyseur de performances) affiche la requête DAX et le temps d'exécution pour chaque visuel. Utilisez-le pour :

  1. Identifiez les visuels lents (plus d'une seconde)
  2. Copiez la requête DAX dans DAX Studio pour une analyse détaillée
  3. Comparez les temps d'exécution avant/après lors de l'optimisation des mesures

### Studio DAX

DAX Studio est un outil externe gratuit qui fournit une analyse détaillée des requêtes. Il montre :

  • Requêtes du moteur de stockage (analyses rapides du magasin de colonnes)
  • Requêtes du moteur de formule (évaluation plus lente, ligne par ligne)
  • Tailles de matérialisation (données mélangées entre les moteurs)

Si une mesure génère de nombreuses requêtes de moteur de formule, elle utilise probablement trop d'itérateurs ou d'expressions FILTER complexes. Refactorisez pour pousser plus de travail vers le moteur de stockage.

Pour la formation Power BI qui couvre DAX depuis les principes fondamentaux jusqu'à l'optimisation avancée, ECOSIRE propose des ateliers pratiques adaptés à vos ensembles de données spécifiques et à vos questions commerciales.


##FAQ

Quelle est la différence entre une mesure et une colonne calculée ?

Une mesure est évaluée au moment de la requête dans le contexte de filtre actuel. Il n'ajoute pas de données au tableau --- il calcule une valeur de manière dynamique. Une colonne calculée est évaluée au moment de l'actualisation des données et ajoute une colonne physique à la table. Utilisez des mesures pour les agrégations et les KPI qui changent en fonction des slicers et des filtres. Utilisez des colonnes calculées pour les classifications ou les valeurs au niveau des lignes qui doivent être utilisées dans les segments, les filtres ou les relations. Les mesures sont presque toujours préférées car elles n’augmentent pas la taille du modèle.

Pourquoi ma mesure cumulée sur l'année affiche-t-elle des valeurs incorrectes ?

La cause la plus courante est que votre table de dates n'est pas correctement configurée. Vérifiez trois choses : (1) la table de dates ne présente aucune lacune --- chaque date depuis le début de vos données jusqu'à aujourd'hui doit être incluse, (2) la table est marquée comme table de dates dans Power BI (Outils de table, puis Marquer comme table de dates) et (3) la relation entre la table de dates et votre table de faits est active et correctement mappée. Vérifiez également que votre colonne de date n'inclut pas de composant temporel qui empêche une correspondance exacte.

Quand dois-je utiliser CALCULATE plutôt que FILTER ?

Utilisez CALCULATE lorsque vous pouvez exprimer le filtre sous la forme d'une simple comparaison de colonnes (par exemple, Products[Category] = "Electronics"). CALCULATE convertit cela en un filtre efficace que le moteur de stockage peut optimiser. Utilisez FILTER lorsque vous avez besoin de conditions ligne par ligne complexes faisant référence à plusieurs colonnes ou mesures d'appel (par exemple, filtrer les clients où CALCULATE(COUNTROWS(Sales)) > 5). FILTER est un itérateur et est plus lent, préférez donc la syntaxe simple de CALCULATE lorsque cela est possible.

Comment créer un total cumulé ou une somme cumulée dans DAX ?

Utilisez CALCULATE avec un filtre qui inclut toutes les dates jusqu'à la date actuelle : Revenue Cumulative = CALCULATE(SUM(Sales[Revenue]), FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date]))). Cela supprime le filtre de date existant (TOUS) et le remplace par un filtre qui inclut toutes les dates depuis le début jusqu'à la date maximale dans le contexte actuel. Dans une matrice mensuelle, chaque ligne indique le total cumulé pour ce mois.

Puis-je utiliser DAX pour réécrire des données dans la base de données ?

Non. DAX est un langage de requête en lecture seule. Il peut calculer, filtrer et transformer les données à afficher, mais il ne peut pas insérer, mettre à jour ou supprimer des données dans la base de données source. Pour les scénarios de réécriture, utilisez Power Apps intégrées à Power BI ou utilisez les flux Power Automate déclenchés par les alertes Power BI. Certains outils tiers (Acterys, Writeback Manager) ajoutent des fonctionnalités de réécriture via des visuels personnalisés.

E

Rédigé par

ECOSIRE Research and Development Team

Création de produits numériques de niveau entreprise chez ECOSIRE. Partage d'analyses sur les intégrations Odoo, l'automatisation e-commerce et les solutions d'entreprise propulsées par l'IA.

Plus de Data Analytics & BI

Guide complet de développement de tableaux de bord Power BI

Découvrez comment créer des tableaux de bord Power BI efficaces avec une conception KPI, des bonnes pratiques visuelles, des pages d'accès au détail, des signets, des mises en page mobiles et la sécurité RLS.

Power BI Embedded : ajouter des analyses à votre application

Intégrez les analyses Power BI dans votre application SaaS. Couvre l'authentification, le RLS multi-tenant, le dimensionnement de la capacité, le SDK JavaScript, les thèmes personnalisés et la tarification Fabric.

Migration d'Excel vers Power BI : guide étape par étape

Guide complet de migration d'Excel vers Power BI couvrant la traduction de formules, la création de modèles de données, Power Query, la validation et la mise hors service.

Le guide complet de l'intégration Power BI + Odoo

Connectez Power BI à Odoo ERP pour des analyses avancées. Requêtes directes PostgreSQL, tables clés, tableaux de bord ventes/inventaire/RH et configuration d'actualisation incrémentielle.

Mesurer le retour sur investissement de l'IA en entreprise : un cadre qui fonctionne réellement

Un cadre pratique pour mesurer le retour sur investissement de l’IA couvrant les économies directes, les gains de productivité, l’impact sur les revenus et la valeur stratégique dans tous les départements.

Création de tableaux de bord de reporting financier : KPI, conception et intégration ERP

Concevez des tableaux de bord de reporting financier qui guident les décisions. Découvrez les KPI à suivre, les principes de conception de tableaux de bord et les meilleures pratiques d'intégration ERP.

Discutez sur WhatsApp