3.1 · CALCULATE, contexte de filtre & variables (VAR)

Niveau 3 · Analyse avancée

3.1CALCULATE, contexte de filtre & variables (VAR)

Objectif : Lire à voix haute le contexte d'une cellule de visuel, écrire le « % du total » avec CALCULATE + ALL + VAR, et diagnostiquer un résultat DAX par son contexte.
Temps estimé : 25 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

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.

Erreur d'interprétation fréquente : « Le DAX, c'est des formules à réciter ; un résultat faux cache une faute de syntaxe, et le contexte ne change rien. » Non, triple erreur. Un résultat DAX « bizarre » est presque toujours un contexte de filtre mal compris : on le lit à voix haute avant tout. CALCULATE ne calcule pas « plus » : il change le contexte — il ajoute, écrase ou retire (avec ALL) un filtre. Et toute formule dépassant une ligne se structure avec VAR/RETURN, sinon elle devient illisible et répète ses calculs.
Modifier le contexte de filtre Lire le contexte, le modifier avec CALCULATE, le réduire avec ALL — et le structurer avec VAR. Contexte de filtreCe que la cellule filtre (à lire)+CALCULATEAjoute / écrase un filtre+ALLRetire des filtres (% du total) VAR/RETURN dès qu'une formule dépasse une ligne.
Lire le contexte, le modifier avec CALCULATE, le réduire avec ALL — et le structurer avec VAR.
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Zineb, contrôleuse de gestion à Alger, lit le contexte : la cellule « Lyon × Janvier » de sa matrice = [Total CA] filtré sur Lyon ET janvier, sans qu'elle ait rien écrit. 2) Elle le modifie : CALCULATE([Total CA]; ALL(Ventes[Ville])) retire le filtre ville et renvoie le total toutes villes ; assemblé dans une variable, il donne la part de chaque ville du total. 3) Elle structure avec VAR/RETURN — total global calculé une fois, formule lisible, diagnostic par le contexte. Leçon : un résultat bizarre commence toujours par un contexte mal compris qu'on lit à voix haute.

🔎 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é

  1. Créez une matrice Ville × [Total CA] et LISEZ chaque cellule en énonçant son contexte : « cette cellule = CA filtré sur Lyon », comme Zineb.
  2. É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é).
  3. Assemblez avec variables : Part ville = VAR Total = CALCULATE([Total CA]; ALL(Ventes[Ville])) RETURN DIVIDE([Total CA]; Total), puis formatez en %.
  4. Testez avec un segment Commercial actif : la part se recalcule DANS le périmètre du segment — relisez la formule jusqu'à pouvoir expliquer pourquoi.
Le trio contexte + CALCULATE/ALL + VAR maîtrisé sur le calcul le plus demandé : le % du total.

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é.

Checklist sortie de section
  • 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.
Auto-évaluation 1-5 : est-ce que j'explique le contexte de filtre sans jargon ?Auto-évaluation 1-5 : ai-je construit le % du total avec VAR/RETURN ?

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é.

Vérifiez votre compréhension

À quoi sert ALL dans CALCULATE ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 3Questions inédites et durcies pour valider vos acquis