Contexte de ligne, contexte de filtre et transition de contexte

Première leçon du cours DAX avancé (contexte, time intelligence), en accès libre : environ 20 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Distinguer précisément contexte de ligne et contexte de filtre
  • Expliquer et utiliser la transition de contexte
  • Prévoir le résultat d'une formule dans une colonne calculée ou un itérateur

Contexte de ligneContexte de filtreTransition de contexte

Deux contextes, deux rôles

DAX évalue chaque expression dans un contexte. Il en existe deux sortes, et la plupart des surprises viennent de leur confusion.

Contexte de ligne Contexte de filtre
Où ? colonnes calculées, itérateurs (SUMX, FILTER…) cellules de visuel, segments, CALCULATE
Effet « je suis sur cette ligne » : on peut lire ses colonnes « seules ces lignes sont visibles »
Se propage par les relations ? non (il faut RELATED) oui, du côté un vers le côté plusieurs

L’expérience qui éclaire tout

Ajoutez dans DimMagasin (2 lignes) deux colonnes calculées :

CA sans CALCULATE = SUM ( FaitVentes[Montant] )
CA avec CALCULATE = CALCULATE ( SUM ( FaitVentes[Montant] ) )
  • La première affiche 3 925 sur les deux lignes. Le contexte de ligne sait que l’on est sur Lyon, mais il ne filtre pas FaitVentes : SUM voit toute la table.
  • La seconde affiche 2 185 pour Lyon et 1 740 pour Lille. CALCULATE a pris la ligne courante (CodeMagasin = M1, Magasin = Lyon) et l’a transformée en filtre, qui se propage ensuite à FaitVentes par la relation.

C’est la transition de contexte : CALCULATE (et CALCULATETABLE) convertit tout le contexte de ligne actif en contexte de filtre (un filtre sur chaque colonne de la ligne).

La mesure cache un CALCULATE

Écrivez une troisième colonne :

CA via mesure = [Total ventes]

Résultat : 2 185 et 1 740. Toute référence à une mesure est implicitement entourée d’un CALCULATE : [Total ventes] équivaut à CALCULATE ( SUM ( FaitVentes[Montant] ) ). C’est pourquoi vos itérateurs sur des dimensions fonctionnaient dans le cours précédent :

Meilleur mois = MAXX ( VALUES ( Dates[Année-Mois] ), [Total ventes] )

Pour chaque mois, la mesure est évaluée avec le mois comme filtre ; MAXX garde le maximum : 290 (décembre 2025, tous magasins). Pour Lyon seul : 160 ; pour Lille : 130. Si vous remplacez [Total ventes] par SUM ( FaitVentes[Montant] ), il n’y a plus de transition : chaque mois renvoie le total du contexte, et le résultat est faux (3 925 sans filtre).

Compter des éléments selon une condition

Le même mécanisme permet de compter des mois :

Nb mois > 200 =
COUNTROWS ( FILTER ( VALUES ( Dates[Année-Mois] ), [Total ventes] > 200 ) )

Résultat : 13 mois (7 en 2025, 6 en 2026).

Les pièges de la transition

  1. Coût : dans SUMX ( FaitVentes, [Total ventes] ), la transition est déclenchée pour chaque ligne de faits, ce qui peut être très lent sur des millions de lignes. Itérez sur une dimension ou une colonne à faible cardinalité.
  2. Lignes en double : la transition filtre sur toutes les colonnes de la ligne. Si deux lignes de faits sont identiques, chacune « voit » les deux, et le résultat est doublé. Les itérateurs sur une table de faits sans clé unique avec une mesure sont donc dangereux.
  3. Lisibilité : en lisant une formule, repérez chaque mesure référencée dans un itérateur : elle signale une transition.

Méthode pour prévoir un résultat

Pour toute formule, posez-vous trois questions :

  1. Quel est le contexte de filtre de départ (cellule, segments) ?
  2. Y a-t-il un contexte de ligne (colonne calculée, itérateur) ?
  3. Y a-t-il un CALCULATE, explicite ou caché dans une mesure, qui transforme la ligne en filtre ?

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. TâcheDifficulté 21 indice

    Mettre en évidence la transition de contexte

    Jeu de données du cours. Créez C:\Formation\ventes_mensuelles.csv (UTF-8) avec les 36 lignes ci-dessous (une vente agrégée par magasin et par mois, de janvier 2025 à juin 2026) :

    Date,CodeMagasin,Montant
    2025-01-15,M1,100
    2025-01-15,M2,80
    2025-02-15,M1,110
    2025-02-15,M2,85
    2025-03-15,M1,120
    2025-03-15,M2,90
    2025-04-15,M1,105
    2025-04-15,M2,95
    2025-05-15,M1,115
    2025-05-15,M2,100
    2025-06-15,M1,130
    2025-06-15,M2,105
    2025-07-15,M1,90
    2025-07-15,M2,70
    2025-08-15,M1,80
    2025-08-15,M2,60
    2025-09-15,M1,125
    2025-09-15,M2,95
    2025-10-15,M1,135
    2025-10-15,M2,100
    2025-11-15,M1,140
    2025-11-15,M2,110
    2025-12-15,M1,160
    2025-12-15,M2,130
    2026-01-15,M1,120
    2026-01-15,M2,90
    2026-02-15,M1,115
    2026-02-15,M2,100
    2026-03-15,M1,130
    2026-03-15,M2,95
    2026-04-15,M1,125
    2026-04-15,M2,105
    2026-05-15,M1,135
    2026-05-15,M2,110
    2026-06-15,M1,150
    2026-06-15,M2,120

    Puis : importez-le dans la table FaitVentes (Date en type Date, Montant en entier) ; créez DimMagasin avec Accueil > Entrer des données (CodeMagasin, Magasin : M1, Lyon et M2, Lille) ; créez la table Dates en DAX :

    Dates =
    ADDCOLUMNS (
        CALENDAR ( DATE ( 2025, 1, 1 ), DATE ( 2026, 12, 31 ) ),
        "Année", YEAR ( [Date] ),
        "Numéro mois", MONTH ( [Date] ),
        "Année-Mois", FORMAT ( [Date], "yyyy-mm" )
    )

    Marquez Dates comme table de dates, reliez Dates[Date] → FaitVentes[Date] et DimMagasin[CodeMagasin] → FaitVentes[CodeMagasin], et créez Total ventes = SUM ( FaitVentes[Montant] ). Contrôle : Total ventes = 3 925.

    1. Dans DimMagasin, créez les colonnes calculées CA sans CALCULATE, CA avec CALCULATE et CA via mesure.
    2. Créez les mesures Meilleur mois (MAXX avec la mesure) et Meilleur mois (faux) (MAXX avec SUM ( FaitVentes[Montant] )).
    3. Placez les deux mesures dans un tableau par magasin, avec une ligne de total.
    • CA sans CALCULATE = 3 925 sur les deux lignes
    • CA avec CALCULATE et CA via mesure = 2 185 (Lyon) et 1 740 (Lille)
    • Meilleur mois : Lyon 160, Lille 130, total 290
    • Meilleur mois (faux) : Lyon 2 185, Lille 1 740, total 3 925
  2. CodeDifficulté 21 indice

    Compter les mois au-dessus d'un seuil

    Écrivez la mesure Nb mois > 200 qui compte les mois (colonne Dates[Année-Mois]) dont [Total ventes] dépasse strictement 200.

    Nb mois > 200 =
        -- à compléter
  3. QCMDifficulté 31 indice

    Prévoir le résultat

    Dans une colonne calculée de DimMagasin, que renvoie COUNTROWS ( FaitVentes ) ?

    • Le nombre de ventes du magasin de la ligne
    • Le nombre total de lignes de FaitVentes (36) sur chaque ligne
    • Une erreur
    • BLANK

Quiz de fin de leçon

  1. Qu’est-ce que la transition de contexte ?

    • La conversion du contexte de ligne en contexte de filtre par CALCULATE
    • Le passage d'une page à l'autre
    • Le tri d'une colonne
  2. Pourquoi [Total ventes] dans une colonne calculée de DimMagasin donne-t-il le CA du magasin ?

    • Parce qu'une mesure est implicitement entourée de CALCULATE
    • Parce que les colonnes calculées filtrent toujours
    • Parce que la relation est bidirectionnelle
  3. Quel est le risque de SUMX ( FaitVentes, [Total ventes] ) sur une grande table ?

    • Aucun
    • Une transition de contexte par ligne : lenteur et doublons possibles
    • Une erreur de syntaxe

La suite du cours

  1. Les modificateurs de CALCULATE : ALL, ALLEXCEPT, ALLSELECTED, KEEPFILTERS20 min
  2. Time intelligence : cumuls annuels et comparaisons N-120 min
  3. Cumuls, moyennes mobiles, classements et fonctions de fenêtre20 min
  4. Groupes de calcul, performance et débogage20 min

DAX avancé (contexte, time intelligence) · Avancé · 1 h 40