Demandez à dix débutants ce que fait CALCULATE : beaucoup répondront « elle calcule une expression ». La réponse est trop vague pour être utile. CALCULATE évalue bien une expression, mais son intérêt est ailleurs : elle change le contexte de filtre dans lequel cette expression est évaluée. C'est la fonction qui permet de dire « calcule le CA, mais dans une autre bulle de filtres que celle de la cellule actuelle ».
Ce détail explique pourquoi CALCULATE apparaît partout : ratios, parts du total, comparaisons N-1, mesures sur un périmètre fixe, indicateurs qui ignorent certains slicers, règles métier qui croisent plusieurs conditions. Quand une mesure DAX paraît magique, il y a presque toujours un contexte de filtre modifié derrière.
Le contexte de filtre, en une image
Chaque cellule d'un visuel Power BI est calculée dans une bulle de filtres. La ligne du tableau filtre peut être un client. La colonne filtre peut être un mois. Un slicer filtre l'année. Un filtre de page limite la société. Cette bulle complète est le contexte de filtre.
1. Cellule du visuel
La ligne, la colonne, les slicers et les filtres de page créent le contexte de départ.
2. Arguments CALCULATE
Chaque filtre modifie cette bulle : il remplace, retire, garde ou croise une partie du contexte.
3. Expression évaluée
[CA] est calculée seulement après cette modification du contexte.
Quand une mesure surprend, dessinez ces trois blocs avant de toucher au DAX. La plupart des erreurs deviennent visibles.
CA =
SUM ( Ventes[Montant] )| Région | Segment | CA 2026 |
|---|---|---|
| Bretagne | PME | 120 000 € |
| IDF | PME | 180 000 € |
| IDF | ETI | 120 000 € |
| Occitanie | PME | 80 000 € |
La mesure CA ne somme donc jamais « toute la table » en général. Elle somme les lignes de Ventes qui restent visibles dans la bulle de la cellule. Même mesure, cent cellules, cent résultats : ce n'est pas la formule qui change, c'est le contexte.
Ce que CALCULATE fait vraiment
La définition opérationnelle est simple : CALCULATE prend une expression, construit un contexte de filtre cible, puis évalue l'expression dans ce contexte cible. La documentation Microsoft le formule ainsi : CALCULATE évalue une expression dans un contexte de filtre modifié. Ce n'est pas une nuance de vocabulaire ; c'est la clé de lecture.
CALCULATE (
<Expression>,
<Filtre 1>,
<Filtre 2>,
...
)L'expression est souvent une mesure, par exemple [CA]. Les filtres qui suivent peuvent être des conditions simples, des tables filtrées ou des fonctions qui modifient les filtres existants. Le résultat dépend moins de la complexité de la formule que de la précision avec laquelle vous avez défini le contexte cible.
Les trois familles de filtres dans CALCULATE
Pour lire une mesure CALCULATE, commencez par identifier la nature des filtres passés en arguments. Ils ne se comportent pas tous pareil et ils ne racontent pas la même intention.
1. Le filtre booléen : une condition directe
CA IDF =
CALCULATE (
[CA],
Clients[Region] = "IDF"
)Ici, le filtre est une condition qui porte directement sur une colonne. C'est le cas le plus lisible. Si la cellule actuelle contenait déjà un filtre sur Clients[Region], ce filtre est remplacé par IDF, sauf si vous utilisez KEEPFILTERS. Ce comportement de remplacement est la première source de surprises.
2. Le filtre de table : une table passée à CALCULATE
CA Clients Actifs =
CALCULATE (
[CA],
FILTER (
Clients,
Clients[Statut] = "Actif"
&& Clients[DateCreation] <= DATE ( 2026, 1, 1 )
)
)FILTER retourne une table. CALCULATE utilise ensuite cette table comme filtre. Ce format est utile quand la condition ne peut pas s'écrire proprement en filtre booléen direct. Il faut toutefois l'utiliser avec intention : un FILTER posé par réflexe rend souvent une mesure plus lente et moins lisible qu'une condition directe.
3. Le modificateur de filtre : retirer, garder, croiser
| Fonction | Intention | Exemple d'usage |
|---|---|---|
| REMOVEFILTERS | Retirer des filtres | Calculer un total ou un dénominateur |
| ALL | Retourner toutes les valeurs ou retirer des filtres selon l'usage | Anciennes mesures de total, tables dans SUMX |
| KEEPFILTERS | Croiser avec le filtre existant au lieu de le remplacer | Restreindre sans écraser la sélection du visuel |
| ALLSELECTED | Conserver les sélections externes et retirer le filtre du visuel courant | Totaux visuels, à utiliser avec prudence |
Ces fonctions ne servent pas à « filtrer une valeur » comme une condition. Elles changent la manière dont CALCULATE compose le contexte cible. C'est pour cela qu'elles doivent être lues comme des verbes : retirer, garder, croiser, respecter la sélection extérieure.
Remplacer ou croiser : le piège principal
Par défaut, lorsqu'un filtre CALCULATE cible une colonne déjà filtrée, il remplace le filtre existant sur cette colonne. Si vous êtes dans une ligne Bretagne et que votre mesure impose Region = IDF, le résultat n'est pas « Bretagne et IDF ». Le filtre Bretagne est remplacé.
CA IDF =
CALCULATE (
[CA],
Clients[Region] = "IDF"
)Dans un tableau par région, cette mesure affiche le CA IDF sur toutes les lignes, parce que chaque ligne perd son filtre région initial avant l'évaluation de [CA]. Ce comportement est normal, mais il choque quand on pense que les filtres s'additionnent automatiquement.
CA IDF Visible =
CALCULATE (
[CA],
KEEPFILTERS ( Clients[Region] = "IDF" )
)Avec KEEPFILTERS, le filtre IDF est croisé avec le contexte existant. Sur la ligne IDF, la mesure retourne le CA IDF. Sur la ligne Bretagne, l'intersection entre Bretagne et IDF est vide, donc la mesure retourne vide. KEEPFILTERS ne sert pas à faire joli : il dit explicitement que vous voulez restreindre sans écraser.
| Ligne du visuel | [CA] | [CA IDF] | [CA IDF Visible] |
|---|---|---|---|
| Bretagne | 120 000 € | 300 000 € | vide |
| IDF | 300 000 € | 300 000 € | 300 000 € |
| Occitanie | 80 000 € | 300 000 € | vide |
| Total | 500 000 € | 300 000 € | 300 000 € |
| Vous écrivez | La bulle devient | Résultat |
|---|---|---|
| [CA] | Inchangée | Le CA de la cellule |
| CALCULATE([CA], Clients[Region] = "IDF") | Region : remplacée par IDF | Le CA IDF, partout |
| CALCULATE([CA], KEEPFILTERS(Clients[Region] = "IDF")) | Region : croisée avec l'existant | Le CA IDF si la cellule parle d'IDF, sinon vide |
| CALCULATE([CA], REMOVEFILTERS(Clients)) | Tous les filtres Clients : retirés | Le CA toutes régions, la base d'un % du total |
L'exemple qui fait tout comprendre : la part du total
Une part du total est le meilleur exercice pour comprendre CALCULATE. Le numérateur doit respecter la cellule actuelle. Le dénominateur doit ignorer seulement le filtre qui crée les lignes du tableau, par exemple la région. On ne veut donc pas changer la mesure [CA], on veut changer le contexte dans lequel elle est évaluée.
Part du CA =
DIVIDE (
[CA],
CALCULATE (
[CA],
REMOVEFILTERS ( Clients[Region] )
)
)Sur une ligne Bretagne, le numérateur est le CA Bretagne. Le dénominateur part de la même cellule, retire le filtre Clients[Region], puis recalcule [CA]. La formule donne donc CA Bretagne divisé par CA toutes régions, tout en respectant les autres filtres du rapport : année, segment, société, produit, etc.
| Région | Numérateur [CA] | Dénominateur après REMOVEFILTERS | Part du CA |
|---|---|---|---|
| Bretagne | 120 000 € | 500 000 € | 24 % |
| IDF | 300 000 € | 500 000 € | 60 % |
| Occitanie | 80 000 € | 500 000 € | 16 % |
CALCULATE sans filtre : la transition de contexte
CALCULATE a un second rôle qui surprend beaucoup : utilisée sans filtre, elle peut transformer un contexte de ligne en contexte de filtre. C'est ce que l'on appelle la transition de contexte. Le sujet devient important dans les colonnes calculées et dans les itérateurs comme SUMX, ADDCOLUMNS ou AVERAGEX.
Un contexte de ligne signifie : DAX est en train de parcourir une ligne, mais cette ligne ne filtre pas automatiquement le modèle. Un contexte de filtre signifie : cette ligne devient un filtre actif pour évaluer une mesure ou une expression. CALCULATE sert de pont entre les deux.
Clients avec CA =
ADDCOLUMNS (
VALUES ( Clients[ClientKey] ),
"CA Client",
CALCULATE ( [CA] )
)ADDCOLUMNS crée un contexte de ligne sur chaque client retourné par VALUES. CALCULATE transforme ce client courant en filtre avant d'évaluer [CA]. Sans comprendre ce passage, beaucoup de mesures dans les itérateurs ressemblent à des incantations.
Dans quel ordre lire une mesure CALCULATE
L'ordre exact d'évaluation interne peut devenir subtil dans les cas avancés. Pour lire et déboguer 90 % des mesures métier, gardez une méthode pratique en quatre étapes.
- 1Identifier le contexte de départLignes du visuel, colonnes, slicers, filtres de page et relations actives.
- 2Lister chaque argument de CALCULATECondition directe, table filtrée ou modificateur de filtre : la famille dit l'intention.
- 3Repérer les colonnes remplacéesUn filtre direct sur une colonne remplace le filtre existant sur cette colonne, sauf KEEPFILTERS.
- 4Lire l'expression finale dans le contexte cible
[CA],[Marge]ou[Quantité]n'est évaluée qu'à la fin.
Cette discipline paraît lente au début. Elle évite pourtant la majorité des mesures bricolées, celles qui marchent dans une carte KPI mais se contredisent dès qu'on les met dans une matrice.
Les pièges fréquents
1. Utiliser ALL partout
ALL est historique et très présent dans les exemples. Mais quand votre intention est simplement de retirer des filtres dans CALCULATE, REMOVEFILTERS est souvent plus lisible. Le nom dit exactement ce que vous voulez faire.
CA Toutes Regions =
CALCULATE (
[CA],
REMOVEFILTERS ( Clients[Region] )
)2. Oublier les autres filtres encore actifs
Retirer le filtre région ne retire pas le filtre année, ni le filtre produit, ni le filtre société. C'est généralement ce que vous voulez. Mais si vous attendiez un grand total absolu, la mesure semblera fausse alors qu'elle respecte simplement les autres filtres encore présents.
3. Confondre total visuel et total global
Un total global ignore largement le contexte. Un total visuel respecte les sélections externes et retire seulement les filtres créés par le visuel courant. ALLSELECTED peut répondre à ce besoin, mais il devient difficile à raisonner dans les modèles complexes. Ne l'utilisez pas comme un correctif magique.
4. Tester seulement dans une carte
Une carte KPI masque les erreurs de contexte. Testez les mesures dans une matrice avec au moins une dimension en ligne et un slicer actif. Si le résultat reste logique ligne par ligne, la mesure commence à être crédible.
Déboguer une mesure CALCULATE qui semble fausse
Quand une mesure CALCULATE retourne un résultat inattendu, ne commencez pas par réécrire la formule. Commencez par isoler le contexte. La plupart du temps, l'erreur vient d'un filtre retiré trop largement, d'un filtre remplacé alors qu'il devait être croisé, ou d'une dimension qui filtre le modèle par un chemin que vous n'aviez pas en tête.
- 1Créer une matrice de contrôleMettez la dimension suspecte en ligne, la mesure de base et la mesure CALCULATE côte à côte.
- 2Ajouter un slicer qui doit rester actifSegment, année, société ou produit : le test doit montrer si le dénominateur respecte encore ce périmètre.
- 3Tester le retrait minimalRemplacez un retrait de table par un retrait de colonne quand c'est possible : REMOVEFILTERS(Clients[ClientKey]) avant REMOVEFILTERS(Clients).
- 4Comparer le total visible et le total métierSi le pourcentage ne somme pas comme l'utilisateur l'attend, ce n'est pas forcément une erreur DAX : c'est souvent un périmètre métier mal nommé.
Part Client =
DIVIDE (
[CA],
CALCULATE (
[CA],
REMOVEFILTERS ( Clients )
)
)Cette mesure peut être correcte si vous voulez la part d'un client dans tout le portefeuille. Mais dans beaucoup de rapports, l'utilisateur attend la part du client dans le segment, la région ou le portefeuille commercial déjà sélectionné. REMOVEFILTERS(Clients) retire trop de choses : région, segment, commercial, typologie. Le dénominateur devient plus large que le total visible à l'écran.
Part Client dans Region =
DIVIDE (
[CA],
CALCULATE (
[CA],
REMOVEFILTERS ( Clients[ClientKey] )
)
)Ici, on retire seulement le filtre du client courant. Les autres filtres de la table Clients restent actifs. Si le visuel est filtré sur une région ou un segment, le dénominateur reste dans ce périmètre. Ce n'est pas une question de syntaxe plus jolie ; c'est une question de périmètre métier.
Quand ne pas ajouter CALCULATE
CALCULATE n'est pas un signe de sophistication. Une mesure simple doit rester simple. Si vous n'avez pas besoin de modifier le contexte de filtre, d'activer une transition de contexte ou d'exprimer un périmètre particulier, CALCULATE ne rend pas la mesure meilleure.
CA =
CALCULATE (
SUM ( Ventes[Montant] )
)Cette mesure fonctionne, mais elle ne dit rien de plus que SUM(Ventes[Montant]) si elle n'est pas écrite dans un contexte de ligne qui exige une transition. Dans un modèle maintenable, les mesures doivent montrer l'intention. Un CALCULATE vide attire l'attention ; il doit donc avoir une raison.
CA =
SUM ( Ventes[Montant] )La bonne pratique est de créer des mesures de base très lisibles, puis de construire les variantes de contexte au-dessus. [CA], [Marge], [Quantité] doivent rester évidentes. [CA Toutes Régions], [Part du CA] ou [CA IDF Visible] portent ensuite l'intention de contexte.
- Contexte de filtre
- Ensemble des filtres actifs au moment où une expression est évaluée : visuel, slicers, page, rapport et relations.
- Remplacement de filtre
- Comportement par défaut de CALCULATE quand un argument cible une colonne déjà filtrée : le nouveau filtre prend la place de l'ancien.
- Transition de contexte
- Passage d'un contexte de ligne à un contexte de filtre, notamment dans les itérateurs et les colonnes calculées.
- Total visuel
- Total qui respecte les sélections extérieures tout en ignorant la ligne ou la colonne courante du visuel.
Les trois réflexes à installer
- Avant d'écrire CALCULATE, dites à voix haute quelle bulle vous voulez : « le CA, mais sans le filtre région », si vous ne savez pas le dire, la mesure sera fausse.
- Un filtre sur une colonne REMPLACE le filtre existant sur cette colonne ; si vous voulez croiser, c'est KEEPFILTERS.
- Testez chaque mesure dans un tableau à deux dimensions (lignes + slicer) avant de la croire : les bulles y sont visibles à l'œil nu.
À retenir
CALCULATE ne rend pas une mesure intelligente. Elle rend explicite le contexte dans lequel la mesure doit être évaluée. Pensez contexte d'abord, calcul ensuite.
Pour creuser au niveau au-dessus, contextes imbriqués, transition de contexte, subtilités d'ALLSELECTED, la référence mondiale reste SQLBI, dont les articles font autorité. Pour appliquer ces principes à un vrai modèle d'entreprise, le travail commence plus tôt : modèle propre, mesures de base fiables, conventions de nommage et tests dans les visuels qui révèlent les erreurs.
Écrit par Dylan Arnaud, fondateur de Datafuji. Les exemples techniques sont conçus pour être relus, testés et adaptés dans un modèle Power BI réel.