CALCULATE dans Power BI : modifier le contexte de filtre
- Groupe Kronoscope
- 12 août
- 5 min de lecture
CALCULATE est la fonction la plus utilisée du langage DAX. Elle évalue une expression dans un contexte de filtre modifié. Mais attention : elle n'ajoute pas toujours un filtre. Le plus souvent, elle le remplace.
Cet article démontre ce comportement avec des exemples chiffrés.
Un exemple simple pour comprendre CALCULATE
Prenons une table Ventes de six lignes. Chaque ligne porte un vendeur, un canal et un montant.
Client | Canal | CA |
Alice | Web | 1 000 € |
Alice | Magasin | 500 € |
Bruno | Web | 2 000 € |
Bruno | Magasin | 1 500 € |
Chloé | Web | 800 € |
Chloé | Magasin | 1 200 € |
La somme de tous les montants vaut 7 000 €. Écrivons maintenant une mesure qui ne retient que le canal Web.
CA Web =
CALCULATE (
SUM ( Ventes[Montant] ),
Ventes[Canal] = "Web"
)Le résultat vaut 3 800 €. Vérifions-le ligne par ligne :
Client | Canal | Montant | Retenu ? |
Alice | Web | 1 000 € | ✓ |
Alice | Magasin | 500 € | — |
Bruno | Web | 2 000 € | ✓ |
Bruno | Magasin | 1 500 € | — |
Chloé | Web | 800 € | ✓ |
Chloé | Magasin | 1 200 € | — |
Total | 3 800 € |
La syntaxe et ses trois types de filtres
Syntaxe
CALCULATE ( <expression> [, <filtre1> [, <filtre2> [, …]]] )
Le premier argument est obligatoire. Les filtres suivants sont facultatifs.
Le premier argument se comporte comme une mesure. Les arguments suivants modifient le contexte de filtre. Microsoft distingue trois familles de filtres.
Les filtres booléens et leurs quatre règles
Un filtre booléen est une condition qui renvoie VRAI ou FAUX. C'est la forme la plus courante. La documentation Microsoft lui impose quatre règles.
Il ne référence que les colonnes d'une seule table.
Il ne peut pas référencer une mesure.
Il ne peut pas contenir un CALCULATE imbriqué.
Il ne peut pas appeler une fonction qui renvoie une table.
La dernière règle souffre une exception très utile. Une fonction d'agrégation qui renvoie un scalaire reste autorisée.
CA de la dernière date =
CALCULATE (
SUM ( Ventes[Montant] ),
Ventes[Date] = MAX ( Ventes[Date] )
)Les filtres de table avec FILTER
Quand la condition sort de ces règles, il faut une expression de table. La fonction FILTER prend alors le relais. Elle sert notamment à filtrer sur le résultat d'une mesure.
CA des bons vendeurs =
CALCULATE (
SUM ( Ventes[Montant] ),
FILTER ( Vendeurs, [CA vendeur] > 2000 )
)Attention au coût de cette écriture. FILTER parcourt la table ligne à ligne. Sur une table de faits volumineuse, préférez un filtre booléen. Notre article sur la fonction FILTER détaille ce choix.
Pourquoi CALCULATE remplace le filtre existant
Voici le comportement qui surprend le plus en formation. Plaçons la mesure CA Web dans un tableau ventilé par canal.
Canal | CA total | CA Web |
Magasin | 3 200 € | 3 800 € |
Web | 3 800 € | 3 800 € |
Total | 7 000 € | 3 800 € |

Ce que fait réellement le moteur
Le visuel filtre déjà la colonne Canal sur Magasin. CALCULATE applique ensuite son filtre sur cette même colonne. Le nouveau filtre écrase l'ancien au lieu de s'y ajouter.
La règle tient en deux phrases. Sur une colonne déjà filtrée, CALCULATE remplace. Sur une colonne libre, CALCULATE ajoute.
KEEPFILTERS pour cumuler au lieu de remplacer
KEEPFILTERS modifie ce comportement. Le filtre du visuel est conservé, puis croisé avec celui de la mesure.
CA Web strict =
CALCULATE (
SUM ( Ventes[Montant] ),
KEEPFILTERS ( Ventes[Canal] = "Web" )
)La ligne Magasin devient vide. Magasin et Web n'ont aucune ligne commune. La ligne Web affiche toujours 3 800 €.
C'est presque toujours le résultat attendu par le lecteur du rapport.
Retenez bien
Sur une colonne déjà filtrée, CALCULATE remplace le filtre. KEEPFILTERS le conserve et croise les deux.
La transition de contexte
CALCULATE s'utilise aussi sans aucun filtre. Cet usage porte un nom précis : la transition de contexte. Il convertit un contexte de ligne en contexte de filtre.
Dans une colonne calculée
Créons une première colonne dans la table Vendeurs.
CA sans CALCULATE =
SUM ( Ventes[Montant] )Cette colonne affiche 7 000 € sur les trois lignes. Le contexte de ligne ne filtre pas la table Ventes. Ajoutons maintenant CALCULATE.
CA vendeur =
CALCULATE ( SUM ( Ventes[Montant] ) )Alice obtient 1 500 €, Bruno 3 500 €, Chloé 2 000 €. La ligne courante est devenue un filtre.

Dans un itérateur
Le même mécanisme joue dans FILTER, AVERAGEX ou SUMX. Comptons les vendeurs au-dessus de 2 000 €.
Vendeurs au-dessus de 2 000 =
COUNTROWS (
FILTER ( Vendeurs, CALCULATE ( SUM ( Ventes[Montant] ) ) > 2000 )
)Le résultat vaut 1. Sans CALCULATE, chaque ligne compare 7 000 à 2 000. La mesure renverrait 3, donc un chiffre faux.
Une mesure existante déclenche la transition automatiquement. Écrire [CA vendeur] revient à écrire CALCULATE ( [CA vendeur] ).
Les modificateurs de filtre à connaître
Certains arguments de CALCULATE ne filtrent rien. Ils modifient la façon dont les filtres s'appliquent.
REMOVEFILTERS
Supprime les filtres d'une table ou de colonnes précises. C'est l'écriture recommandée par Microsoft.
KEEPFILTERS
Ajoute un filtre sans écraser celui qui existe déjà sur la même colonne.
USERELATIONSHIP
Active une relation inactive, le temps du calcul seulement.
Trois autres fonctions complètent la liste. ALL et ALLEXCEPT suppriment aussi des filtres. CROSSFILTER change le sens de filtrage d'une relation.
Le pourcentage du total reste le cas d'usage le plus fréquent.
% du total canal =
DIVIDE (
SUM ( Ventes[Montant] ),
CALCULATE ( SUM ( Ventes[Montant] ), REMOVEFILTERS ( Ventes[Canal] ) )
)La ligne Web affiche 54,3 %, la ligne Magasin 45,7 %. La fonction DIVIDE évite ici toute erreur de division par zéro.
Les pièges de CALCULATE en production
Plusieurs filtres forment un ET
Deux filtres passés à CALCULATE se cumulent. Ils forment un ET logique.
CA Web de Bruno =
CALCULATE (
SUM ( Ventes[Montant] ),
Ventes[Canal] = "Web",
Ventes[Vendeur] = "Bruno"
)Le résultat vaut 2 000 €. Pour un OU, écrivez une seule condition avec l'opérateur ||.
CA Web ou Bruno =
CALCULATE (
SUM ( Ventes[Montant] ),
Ventes[Canal] = "Web" || Ventes[Vendeur] = "Bruno"
)Le résultat vaut 5 300 €. Un OU portant sur deux tables différentes impose un filtre de table.
Les limites à connaître
CALCULATE est refusé dans une colonne calculée en mode DirectQuery.
La même restriction vaut pour les règles de sécurité au niveau des lignes.
Un filtre booléen qui référence une mesure est rejeté à la saisie.
Une transition de contexte sur une table à forte cardinalité coûte cher.
CALCULATE ou CALCULATETABLE
Les deux fonctions modifient le contexte de filtre de la même manière. Seule la sortie change. CALCULATE renvoie une valeur unique, CALCULATETABLE renvoie une table.
Ventes Web =
CALCULATETABLE ( Ventes, Ventes[Canal] = "Web" )CALCULATE s'écrit dans quatre emplacements. Une mesure, une colonne calculée, une table calculée et un calcul visuel.
La documentation Microsoft du 4 août 2026 confirme ces quatre emplacements.
En résumé
CALCULATE modifie le contexte de filtre avant d'évaluer son expression. Retenez le remplacement, KEEPFILTERS et la transition de contexte.
Ces trois mécanismes expliquent la majorité des chiffres faux en DAX. Pour revoir les bases de l'agrégation, consultez notre article sur la fonction SUM.



