3.1CALCULATE, contexte de filtre & variables (VAR)
L'essentiel en 30 secondes
- Chaque cellule d'un visuel a son propre contexte de filtre : la cellule « Paris × Janvier » d'une matrice calcule [Total CA] filtré sur Paris ET janvier, sans que vous ayez rien écrit.
- CALCULATE modifie ce contexte : il ajoute un filtre, en écrase un, ou en retire avec ALL — la clé des « % du total ».
- VAR/RETURN structurent toute formule qui dépasse une ligne : lisibilité, performance et débogage facilité.
Mini-cas filé — Zineb lit ses cellules à voix haute à Alger
Zineb, contrôleuse de gestion dans une PME agroalimentaire à Alger, affiche une matrice Ville × Mois de son [Total CA] et reste perplexe devant une cellule qui semble fausse. Elle applique la méthode de la section : au lieu de réécrire la mesure, elle lit le contexte à voix haute — « cette cellule = CA filtré sur Lyon ET janvier » — et comprend que chaque cellule a le sien. Elle ajoute alors CA Toutes villes = CALCULATE([Total CA]; ALL(Ventes[Ville])) : la même valeur partout, le filtre ville retiré. Puis elle assemble la part de chaque ville avec une variable : Part ville = VAR Total = CALCULATE([Total CA]; ALL(Ventes[Ville])) RETURN DIVIDE([Total CA]; Total). Elle teste avec un segment Commercial actif : la part se recalcule dans le périmètre du segment — exactement ce qu'elle veut expliquer à sa direction.
Cas autonome de cette section : il revient dans le cours, le schéma, le script et le défi 48h de la section 3.1.
1. Le contexte de filtre
Voici le chapitre qui sépare l'utilisateur du praticien DAX. Tout calcul s'évalue dans un contexte de filtre : la cellule « Paris × Janvier » d'une matrice calcule [Total CA] filtré sur Paris ET janvier — sans que vous n'ayez rien écrit. Chaque cellule d'un visuel a le sien : axes, légendes, segments et filtres s'y additionnent.
2. CALCULATE, ALL et VAR
CALCULATE MODIFIE ce contexte : il ajoute un filtre, en écrase un (la part du total) ou en retire avec ALL. ALL(Ventes[Ville]) ignore le filtre ville et donne le grand total — c'est la clé du calcul le plus demandé : le « % du total ».
3. Structurer et diagnostiquer
On emballe le tout dans des variables VAR/RETURN : le total global se calcule une fois, la formule se lit d'un trait et le débogage devient simple. Le réflexe de diagnostic tient en une phrase : un résultat DAX « bizarre » est presque toujours un contexte mal compris — Zineb le lit à voix haute avant de toucher à la formule.
🔎 Exemple concret — 🔎 Exemple concret — Le % du total
Le calcul le plus demandé, en formules courtes et lisibles :
CA Toutes villes = CALCULATE([Total CA]; ALL(Ventes[Ville]))
Part ville =
VAR Total = CALCULATE([Total CA]; ALL(Ventes[Ville]))
RETURN DIVIDE([Total CA]; Total) // formatée en %
Lecture : ALL(Ventes[Ville]) retire le filtre ville : la mesure affiche la même valeur dans chaque ligne — le total toutes villes.
Leçon : DIVIDE([Total CA]; Total) donne la part de chaque ville, recalculée dans le périmètre des segments actifs.
Vocabulaire de la section
- Contexte de filtre
- L'ensemble des filtres actifs sur une cellule de visuel (axes, légendes, segments, filtres) : chaque cellule a le sien.
Exemple simple : Zineb énonce : « la cellule Lyon × Janvier = CA filtré sur Lyon et janvier ».
Ce que ce n'est pas : un calcul unique valable pour tout le visuel.
Réflexe : résultat bizarre → lire le contexte à voix haute.
- CALCULATE
- Évalue une expression dans un contexte modifié : il ajoute ou écrase un filtre.
Exemple simple : Zineb force un filtre sur une ville grâce à CALCULATE pour isoler son résultat.
Ce que ce n'est pas : une mesure qui subit le contexte sans le modifier.
Réflexe : modifier un filtre → CALCULATE.
- ALL
- Retire des filtres : ALL(Ventes[Ville]) ignore le filtre ville — la clé des « % du total ».
Exemple simple : Zineb calcule le CA toutes villes pour comparer chaque ville au total.
Ce que ce n'est pas : un filtre qui reste actif et fausse la part.
Réflexe : % du total → ALL sur la colonne.
- VAR / RETURN
- Les variables DAX : on nomme un calcul intermédiaire une fois, puis on le retourne avec RETURN.
Exemple simple : Zineb écrit VAR Total = ... RETURN DIVIDE([Total CA]; Total).
Ce que ce n'est pas : un même calcul répété trois fois dans une formule.
Réflexe : plus d'une ligne → VAR/RETURN.
- Transition de contexte
- Le mécanisme avancé par lequel CALCULATE transforme un contexte de ligne en contexte de filtre.
Exemple simple : Zineb sait le nommer et compte le creuser avec la référence SQLBI.
Ce que ce n'est pas : le simple contexte de filtre d'une cellule de visuel.
Réflexe : à connaître de nom, à approfondir plus tard.
En pratique — En pratique — Le « % du total » décortiqué
- Créez une matrice Ville × [Total CA] et LISEZ chaque cellule en énonçant son contexte : « cette cellule = CA filtré sur Lyon », comme Zineb.
- Écrivez CA Toutes villes = CALCULATE([Total CA]; ALL(Ventes[Ville])) et ajoutez-la à la matrice : la même valeur partout (le filtre ville est retiré).
- Assemblez avec variables : Part ville = VAR Total = CALCULATE([Total CA]; ALL(Ventes[Ville])) RETURN DIVIDE([Total CA]; Total), puis formatez en %.
- Testez avec un segment Commercial actif : la part se recalcule DANS le périmètre du segment — relisez la formule jusqu'à pouvoir expliquer pourquoi.
Script pas-à-pas — lire un contexte comme Zineb (8 min)
1) Affichez [Total CA] en matrice, Ville en lignes et Mois en colonnes. 2) Cliquez une cellule et prononcez son contexte : le croisement des deux filtres actifs. 3) Créez CA Toutes villes = CALCULATE([Total CA]; ALL(Ventes[Ville])) : vérifiez que la valeur est identique sur toutes les lignes. 4) Créez Part ville avec VAR/RETURN : VAR Total = CALCULATE([Total CA]; ALL(Ventes[Ville])) RETURN DIVIDE([Total CA]; Total), formatée en %. 5) Posez un segment Commercial : observez la part se recalculer dans le périmètre, et expliquez-le à haute voix.
Si un total semble faux, revenez au point 2 : dans neuf cas sur dix, c'est le contexte qui explique le résultat.
Modèle copier-coller — mes mesures de contexte
CA Toutes villes = CALCULATE([Total CA]; ALL(Ventes[Ville]))
Part ville =
VAR Total = CALCULATE([Total CA]; ALL(Ventes[Ville]))
RETURN DIVIDE([Total CA]; Total) // %
Règle : lire le contexte → le modifier (CALCULATE/ALL) → structurer (VAR/RETURN).
Part du total
Zineb affiche la part de chaque ville dans le CA global : le combo CALCULATE + ALL + VAR, formaté en %.
Total toutes villes
Zineb isole le grand total avec ALL(Ventes[Ville]) : la même valeur répétée sur chaque ligne, un repère constant.
Diagnostic d'une cellule
Un résultat douteux : Zineb lit le contexte à voix haute avant de toucher à la mesure — le bug est souvent là.
Formule lisible
Une mesure de cinq lignes devient claire grâce à VAR : le calcul nommé une fois, RETURN en fin.
✓ Bonnes pratiques
- Lire le contexte d'une cellule à voix haute pour comprendre un résultat.
- Utiliser VAR/RETURN systématiquement dès qu'une formule dépasse une ligne.
- Commencer tout diagnostic par le contexte de filtre.
✗ Pièges fréquents
- Écrire des CALCULATE imbriqués illisibles sans variables.
- Confondre ALL (retire tout) et ALLSELECTED (respecte les segments).
- Chercher un bug ailleurs que dans le contexte.
Points clés à retenir
- Chaque cellule de visuel a son contexte de filtre : lisez-le à voix haute pour comprendre un résultat.
- CALCULATE ajoute/écrase des filtres ; ALL en retire : les deux gestes couvrent l'essentiel des besoins.
- VAR/RETURN systématiques dès qu'une formule dépasse une ligne : lisibilité ET performance.
- Un résultat DAX « bizarre » = un contexte mal compris : le diagnostic commence toujours là.
Défi 48h — appliquez demain
Reproduisez la matrice de Zineb : [Total CA] par Ville, puis ajoutez CALCULATE([Total CA]; ALL(Ventes[Ville])) et la mesure Part ville construite avec VAR/RETURN. Écrivez en une phrase pourquoi la part se recalcule quand un segment est posé.
- Je peux lire le contexte de filtre d'une cellule de visuel.
- Je sais écrire le % du total avec CALCULATE + ALL + VAR.
- Je diagnostique un résultat DAX en repartant du contexte.
Questions fréquentes
ALL, ALLSELECTED, ALLEXCEPT : comment s'y retrouver ?
ALL retire tout filtre sur la cible (le grand total) ; ALLSELECTED respecte les sélections externes, comme les segments ; ALLEXCEPT retire tout sauf les colonnes citées. Commencez par ALL, passez à ALLSELECTED quand le % doit suivre les segments, et gardez ALLEXCEPT pour plus tard — les cas fins se clarifient avec la pratique et la référence SQLBI.
Pourquoi ma mesure est-elle juste en détail mais fausse sur la ligne Total ?
Parce que la ligne Total a un contexte plus large : aucun filtre ville n'y est actif. Une mesure mal construite s'y dégrade — le cas classique est la moyenne de ratios. La solution habituelle est de recalculer par itération avec SUMX plutôt que de moyenner un résultat déjà agrégé. Réflexe : juste au détail, faux au total → suspectez un ratio mal placé.
À quoi sert ALL dans CALCULATE ?