Support formation Rapports Power BI

Itérateurs et variables

En bref

  • Objectifs : reconnaître un itérateur et le contexte de ligne qu'il crée ; choisir entre SUM et SUMX, AVERAGE et AVERAGEX ; classer avec RANKX ; structurer une formule avec VAR et RETURN.
  • Prérequis : « CALCULATE et transition de contexte ».
  • Niveau : intermédiaire.

Pourquoi ?

Beaucoup de calculs ne peuvent pas se faire sur une colonne déjà existante : le coût d'une vente est la quantité multipliée par le coût unitaire du produit, le meilleur pays est celui dont le montant est le plus élevé, un rang compare chaque produit à tous les autres. Ces calculs se font ligne par ligne, puis s'agrègent : c'est le rôle des itérateurs. Dès que la formule s'allonge, les variables la rendent lisible, plus rapide et plus facile à déboguer.

Notions clés

Agrégateurs et itérateurs

  • Un agrégateur (SUM, AVERAGE, MIN, MAX, COUNT) travaille sur une seule colonne : SUM ( Ventes[Montant] ).
  • Un itérateur (fonction en X : SUMX, AVERAGEX, MINX, MAXX, COUNTX, CONCATENATEX, RANKX, et aussi FILTER, ADDCOLUMNS) parcourt une table ligne par ligne, évalue une expression dans un contexte de ligne, puis agrège les résultats.
SUMX ( <table>, <expression> )
  • La table peut être une table du modèle (Ventes), une liste de valeurs (VALUES ( Produit[Categorie] )) ou une table construite dans la formule (SUMMARIZE, ADDCOLUMNS, TOPN).
  • Dans l'expression, une mesure déclenche la transition de contexte : elle est calculée pour l'élément en cours (voir « CALCULATE et transition de contexte »).
  • SUM ( Ventes[Montant] ) est un raccourci de SUMX ( Ventes, Ventes[Montant] ).

Les itérateurs les plus utiles

ItérateurCe qu'il faitExemple d'usage
SUMXSomme d'une expression calculée ligne par ligneCoût = quantité x coût unitaire
AVERAGEXMoyenne d'une expressionMoyenne par couleur, délai moyen
MAXX, MINXPlus grande ou plus petite valeurMontant du meilleur pays
COUNTXNombre de valeurs non videsNombre de ventes par groupe
CONCATENATEXConcaténation de textes avec séparateurListe des catégories sélectionnées
RANKXRang d'un élément dans une tableClassement des produits
FILTERTable des lignes qui respectent une conditionClients ayant acheté plus de 100 €

Les variables : VAR et RETURN

Nom de la mesure =
VAR <nom> = <expression>
[VAR <nom2> = <expression2> …]
RETURN
    <expression utilisant les variables>
  • Une variable est calculée une seule fois, à l'endroit où elle est définie, puis réutilisée telle quelle : c'est une constante.
  • Elle peut contenir une valeur ou une table.
  • Son nom ne contient ni espace ni caractère spécial ; il ne doit pas reprendre le nom d'une table ou d'un mot réservé.

Les variables apportent quatre avantages : performance (une expression utilisée deux fois n'est calculée qu'une fois), lisibilité (chaque étape porte un nom), débogage (il suffit de renvoyer une variable intermédiaire après RETURN pour vérifier sa valeur) et simplicité (moins d'imbrications).

Exemple

Les PBIP FonctionsRelation et FonctionsRegroupement contiennent les itérateurs ci-dessous.

SUMX avec RELATED : le montant au prix catalogue

Montant catalogue (RELATED) = SUMX ( Ventes, Ventes[Quantite] * RELATED ( Produit[PrixUnitaire] ) )

SUMX parcourt les ventes ; pour chacune, RELATED lit le prix catalogue du produit lié, puis SUMX additionne les produits quantité x prix.

AVERAGEX : une moyenne par groupe

Moyenne par couleur = AVERAGEX ( SUMMARIZE ( Ventes, Produit[Couleur] ), [Montant vente] )

SUMMARIZE renvoie les couleurs présentes dans les ventes visibles ; AVERAGEX calcule [Montant vente] pour chaque couleur (transition de contexte), puis en fait la moyenne. AVERAGE ( Ventes[Montant] ) donnerait, elle, le montant moyen d'une ligne de vente.

MAXX : le meilleur élément

Montant du meilleur pays =
MAXX ( ADDCOLUMNS ( VALUES ( Geographie[Pays] ), "@Montant", [Montant vente] ), [@Montant] )

[Capture : PBIP FonctionsRegroupement, page ADDCOLUMNS, matrice par catégorie avec Montant vente, Montant du meilleur pays et Part du meilleur pays]

RANKX : classer les produits

RANKX ( <table>, <expression> [, <value> [, <order> [, <ties>] ] ] )
Rang pays =
IF (
    HASONEVALUE ( Geographie[Pays] ),
    RANKX ( ALL ( Geographie[Pays] ), [Montant vente] )
)
  • RANKX évalue [Montant vente] pour chaque pays de la table ALL ( Geographie[Pays] ), puis situe le pays en cours. Sans ALL, chaque ligne ne verrait que son pays et aurait le rang 1.
  • HASONEVALUE masque le rang sur la ligne de total.
  • L'ordre par défaut est décroissant (1 = plus grande valeur) ; ASC inverse l'ordre, DENSE évite les trous de rang en cas d'égalité.

Une mesure structurée par variables

La mesure ci-dessous, tirée du PBIP TitresIcones (partie 4, page « Rendre le rapport dynamique »), renvoie 1, 0 ou -1 selon l'évolution 2025 par rapport à 2024, pour piloter une règle d'icônes :

Statut évolution =
VAR e = [% évolution]
RETURN
    SWITCH (
        TRUE (),
        ISBLANK ( e ), BLANK (),
        e > 0.05, 1,
        e < -0.05, -1,
        0
    )
  • La variable e évite de calculer le pourcentage d'évolution trois fois.
  • SWITCH ( TRUE (), ... ) teste les conditions dans l'ordre : la première vraie l'emporte. C'est l'équivalent lisible d'une série de IF imbriqués.
  • Le premier test renvoie une valeur vide quand il n'y a pas d'évolution calculable, pour ne pas afficher d'icône sur des lignes sans donnée.

[Capture : PBIP TitresIcones, page Icônes intégrées, matrice avec % évolution et Statut évolution affiché sous forme d'icônes]

Pièges et bonnes pratiques

  • Une variable ne se recalcule pas dans CALCULATE. Elle a été évaluée dans le contexte où elle est définie ; CALCULATE ne la modifie pas. La mesure ci-dessous renvoie toujours 100 % :
Part rouge (incorrect) =
VAR montant = [Montant vente]
RETURN
    DIVIDE ( CALCULATE ( montant, Produit[Couleur] = "Rouge" ), montant )

Écrivez plutôt CALCULATE ( [Montant vente], Produit[Couleur] = "Rouge" ) : c'est la mesure, et non la variable, qui doit être réévaluée.

  • Moyenne de ratios : un taux se calcule sur des totaux (DIVIDE ( [Marge], [CA] )), jamais en faisant la moyenne ou la somme de taux ligne par ligne.
  • Itérateur sur une grande table : itérez de préférence sur une petite table (VALUES d'une colonne de dimension) plutôt que sur toute la table de faits, surtout si l'expression appelle une mesure.
  • Préfixe @ : nommez les colonnes temporaires créées par ADDCOLUMNS avec un @ ("@Montant") pour les distinguer des colonnes du modèle.
  • Débogage : remplacez temporairement l'expression après RETURN par le nom d'une variable pour afficher sa valeur.

À retenir

  • Un itérateur crée un contexte de ligne, évalue une expression pour chaque ligne, puis agrège.
  • Dans un itérateur, une mesure est calculée élément par élément grâce à la transition de contexte.
  • RANKX classe un élément dans une table ; utilisez ALL ou ALLSELECTED pour comparer à tous les éléments.
  • VAR calcule une valeur une seule fois ; RETURN renvoie le résultat.
  • SWITCH ( TRUE (), ... ) remplace avantageusement les IF imbriqués.

Pour aller plus loin

  • Source (Microsoft Learn, SUMX)
  • Source (Microsoft Learn, AVERAGEX)
  • Source (Microsoft Learn, RANKX)
  • Source (Microsoft Learn, VAR)
  • Source (Microsoft Learn, utiliser des variables pour améliorer vos formules)
  • Source (Microsoft Learn, SWITCH)
  • Source (SQLBI, AVERAGE et AVERAGEX)
  • Source (SQLBI, RANKX dans les mesures)

Exercice

Mise en pratique DAX, thème 1 | Mesures de base et ratios (questions 1.4 et 1.6, avec SUMX) et thème 4 | Classements et Top N (RANKX, TOPN, Top N dynamique).