S'il n'y avait qu'une seule fonction à retenir dans tout le langage DAX, ce serait incontestablement CALCULATE().
Dans Power BI, toutes les formules arithmétiques (SUM, AVERAGE, COUNTROWS) s'exécutent passivement dans le cadre qui leur est imposé par les visuels. CALCULATE() est la seule et unique fonction capable d'outrepasser les règles, de manipuler, de remplacer ou d'annihiler les filtres actifs pour produire des analyses sur-mesure.
Dans cette leçon, nous levons le voile sur le concept le plus puissant — et souvent le plus redouté — du décisionnel moderne : le Contexte de Filtre.
🔍 Qu'est-ce que le Contexte de Filtre (Filter Context) ?#
Avant de modifier quoi que ce soit, comprenons ce qu'est un contexte de filtre.
Lorsque vous observez une cellule affichant 150 000 € dans une matrice croisant les Années en colonnes et les Catégories de produits en lignes, cette valeur n'est pas tombée du ciel. Elle est le résultat d'un filtre invisible appliqué à votre modèle :
┌────────────────────────────────────────────────────────┐
│ CELLULE SÉLECTIONNÉE DANS LA MATRICE : │
│ • Ligne active : Dim_Produits[Categorie] = "Mobilier"│
│ • Colonne active : Dim_Calendrier[Année] = 2025 │
│ • Trancheuse : Dim_Clients[Pays] = "France" │
└──────────────────────────┬─────────────────────────────┘
▼
Le moteur VertiPaq applique ces 3 filtres simultanément sur
la table de faits Fact_Ventes et somme les lignes restantes.
Ce faisceau de filtres actifs à un instant T sur une cellule s'appelle le Contexte de Filtre.
⚡ La Syntaxe de CALCULATE()#
La fonction s'articule autour d'une expression principale suivie d'un ou plusieurs modificateurs de filtres :
1. Appliquer un Filtre Restrictif Fixe#
Vous souhaitez afficher dans un KPI les ventes générées uniquement sur le segment Grand Compte, quel que soit le contexte extérieur ?
Ventes Grands Comptes =
CALCULATE(
[Montant Ventes],
Dim_Clients[Segment] = "Grand Compte"
)
Sous le capot, CALCULATE() ajoute le filtre Dim_Clients[Segment] = "Grand Compte" au contexte existant avant d'évaluer [Montant Ventes].
🔓 Supprimer des Filtres avec la Famille ALL#
Que faire si vous devez calculer la Part de Marché ou le Pourcentage du Total Général réalisé par une catégorie ?
Pour diviser les ventes d'une catégorie par le total de toutes les catégories réunies, vous devez faire sauter le filtre de catégorie ! C'est le rôle de la fonction ALL().
┌──────────────────────┬──────────────────┬──────────────────┬──────────────────┐
│ Catégorie │ Ventes Catégorie │ Ventes Globales │ % Part de Marché │
├──────────────────────┼──────────────────┼──────────────────┼──────────────────┤
│ Informatique │ 500 000 € │ 1 000 000 € │ 50,0 % │
│ Mobilier │ 300 000 € │ 1 000 000 € │ 30,0 % │
│ Fournitures │ 200 000 € │ 1 000 000 € │ 20,0 % │
└──────────────────────┴──────────────────┴──────────────────┴──────────────────┘
1. Le Total Général Inconditionnel avec ALL(Table)#
Ventes Total Général =
CALCULATE(
[Montant Ventes],
ALL(Fact_Ventes)
)
% Part du Total Général =
DIVIDE(
[Montant Ventes],
[Ventes Total Général]
)
2. Le Total selon la Sélection Active avec ALLSELECTED()#
Si un utilisateur sélectionne 3 pays spécifiques dans un filtre de rapport, ALL() continuera de calculer le total absolu du monde entier, affichant des parts de marché faussées.
La fonction ALLSELECTED() est l'alternative royale : elle ignore les filtres internes du visuel (les lignes de la matrice) tout en respectant scrupuleusement les filtres choisis par l'utilisateur dans les trancheuses extérieures !
Ventes Total Sélectionné =
CALCULATE(
[Montant Ventes],
ALLSELECTED(Fact_Ventes)
)
% Part du Périmètre Sélectionné =
DIVIDE(
[Montant Ventes],
[Ventes Total Sélectionné]
)
🪄 Le Phénomène Secret : La Transition de Contexte#
C'est sans doute le mécanisme le plus élégant du DAX.
Considérez cette question : Que se passe-t-il si vous appelez CALCULATE() à l'intérieur d'un contexte de ligne (par exemple dans une colonne calculée ou à l'intérieur d'un SUMX) ?
[!NOTE] La Transition de Contexte :
Dès queCALCULATE()est exécuté dans un contexte de ligne, il transforme automatiquement la ligne courante en un contexte de filtre équivalent !
Exemple concret dans une colonne calculée :#
Si vous écrivez dans la table Dim_Clients la colonne calculée suivante :
Total Achats du Client = CALCULATE([Montant Ventes])
Grâce à CALCULATE(), pour chaque client examiné sur la ligne courante, le moteur convertit Dim_Clients[CustomerID] = 1001 en un contexte de filtre et calcule le chiffre d'affaires exact de ce client précis ! Sans CALCULATE(), la colonne afficherait le total de l'ensemble du magasin sur chaque ligne.
🎯 En Résumé#
| Modificateur DAX | Action sur le Contexte de Filtre | Cas d'usage type |
|---|---|---|
Dim[Col] = "Valeur" |
Ajoute ou Remplace le filtre existant | Cibler un pays, un statut ou une catégorie |
ALL(Table / Col) |
Supprime tous les filtres spécifiés | Calcul de % du Total Général universel |
ALLSELECTED(Table) |
Supprime les filtres du visuel mais garde les filtres globaux | Calcul de % de part dans une sélection active |
KEEPFILTERS() |
Intersecte sans écraser le filtre existant | Filtres combinatoires stricts |
Vous possédez désormais la clé de voûte de l'analyse décisionnelle. Dans la prochaine leçon, nous allons associer la puissance de CALCULATE à notre table de dates pour maîtriser la Time Intelligence (comparaisons N-1, YTD, YoY) !
Commentaires