Utiliser des fonctions d’itérateur

Effectué

Les fonctions d’itérateur évaluent une expression pour chaque ligne d’une table. Elles vous offrent flexibilité et contrôle sur la façon dont votre modèle résume les données.

Les fonctions de résumé à une seule colonne, comme SUM, COUNT, MIN et MAX, ont des fonctions d’itérateur équivalentes avec un suffixe « X », comme SUMX, COUNTX, MINX et MAXX. Des fonctions d’itérateur sont également spécialisées pour le filtrage, le classement et les calculs semi-additifs au fil du temps.

Toute fonction d’itérateur nécessite une table et une expression. La table peut être une table de modèle ou toute expression qui renvoie une table. L’expression doit renvoyer une seule valeur pour chaque ligne.

Les fonctions de résumé à une seule colonne, comme SUM, font office d’abréviation. Power BI convertit en interne SUM en SUMX. Par exemple, les deux mesures suivantes renvoient le même résultat et ont les mêmes performances :

Revenue = SUM(Sales[Sales Amount])
Revenue =
SUMX(
    Sales,
    Sales[Sales Amount]
)

Les fonctions d’itérateur évaluent l’expression pour chaque ligne d’une table à l’aide du contexte de ligne. Autrement dit, elles traitent une ligne à la fois pour calculer le résultat final. Ensuite, la table est évaluée dans un contexte de filtre. Par exemple, si un visuel d’état applique un filtre selon l’exercice FY2020, la table Sales comporte uniquement les lignes des ventes de cet exercice.

Important

L’utilisation de fonctions d’itérateur avec des tables volumineuses et des expressions complexes peut ralentir les performances. Des fonctions telles que SEARCH et LOOKUPVALUE peuvent être coûteuses. Si possible, utilisez RELATED pour de meilleures performances.

Fonctions d’itérateur pour les résumés complexes

Les fonctions d’itérateur vous permettent d’agréger plusieurs colonnes. Par exemple, une mesure du chiffre d’affaires peut multiplier la quantité commandée, le prix unitaire et un facteur de remise pour chaque ligne, puis additionner les résultats.

Revenue =
SUMX(
    Sales,
    Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)

Les fonctions d’itérateur peuvent également référencer des tables associées. La mesure de remise peut accéder au prix catalogue à partir de la table des produits à l’aide de la fonction RELATED :

Discount =
SUMX(
    Sales,
    Sales[Order Quantity]
    * (
        RELATED('Product'[List Price]) - Sales[Unit Price]
    )
)

L’image suivante illustre un visuel Table avec les colonnes Month, Revenue et Discount. Revenue et Discount sont les mesures créées précédemment.

Capture d’écran illustrant un visuel Table avec trois colonnes : Month, Revenue et Discount.

Fonctions d’itérateur pour les résumés à granularité plus élevée

Les fonctions d’itérateur peuvent également résumer les données à différents niveaux de détail (grain). Par exemple, vous pouvez calculer une moyenne au niveau de l’élément de ligne ou au niveau de la commande vente.

Dans cet exemple, la table Sales comporte une ligne pour chaque élément de ligne d’une commande vente. Chaque ligne comprend des détails tels que le numéro de commande vente, le produit, la quantité vendue, le prix unitaire et la remise. Plusieurs lignes peuvent avoir le même numéro de commande vente, représentant différents articles dans la même commande.

Pour calculer le revenu moyen par ligne de commande (élément de ligne), vous pouvez itérer sur chaque ligne de la table Sales à l’aide de la fonction AVERAGEX. La formule calcule le chiffre d’affaires pour chaque élément de ligne, puis calcule la moyenne du résultat sur l’ensemble des éléments de ligne dans le contexte de filtre actuel :

Revenue Avg Order Line =
AVERAGEX(
    Sales,
    Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)

Capture d’écran illustrant un visuel Table avec quatre colonnes : Month, Revenue, Discount et Revenue Avg.

Si vous souhaitez calculer le chiffre d’affaires moyen par commande vente (plutôt que par élément de ligne), vous pouvez d’abord obtenir une liste de numéros de commandes vente uniques à l’aide de la fonction VALUES. Ensuite, AVERAGEX itère sur chaque commande vente et calcule la moyenne du chiffre d’affaires total de chaque commande :

Revenue Avg Order =
AVERAGEX(
    VALUES('Sales Order'[Sales Order]),
    [Revenue]
)

La fonction VALUES renvoie les commandes vente uniques en fonction du contexte de filtre actuel, de sorte que la fonction AVERAGEX itère sur chaque commande vente pour chaque mois.

Capture d’écran illustrant un visuel Table avec cinq colonnes : Month, Revenue, Discount, Revenue Avg Order Line et Revenue Avg Order.

Classement avec les fonctions d’itérateur

La fonction RANKX calcule les rangs en itérant sur une table et en évaluant une expression pour chaque ligne.

Le sens de l’ordre peut être croissant ou décroissant. Le classement des chiffres d’affaires utilise généralement l’ordre décroissant, de sorte que la valeur la plus élevée se classe en premier. Le classement d’un élément tel que les plaintes peut utiliser l’ordre croissant, de sorte que la valeur la plus basse se classe en premier. Par défaut, RANKX utilise l’ordre décroissant et ignore les rangs pour les égalités.

Par exemple, une mesure de classement de quantité de produits peut classer les produits par quantité à l’aide des fonctions RANKX et ALL :

Product Quantity Rank =
RANKX(
    ALL('Product'[Product]),
    [Quantity]
)

La fonction ALL supprime les filtres, de sorte que la fonction RANKX classe tous les produits. Dans l’image suivante, deux produits sont à égalité pour la dixième place, donc le produit suivant est classé douzième et le rang 11 est ignoré.

Capture d’écran illustrant un visuel Table avec deux égalités de produits, comme décrit.

Vous pouvez également utiliser le classement dense, qui affecte le rang suivant après une égalité sans sauter de numéros. Pour utiliser un classement dense, la mesure peut inclure l’argument DENSE :

Product Quantity Rank =
RANKX(
    ALL('Product'[Product]),
    [Quantity],
    ,
    ,
    DENSE
)

Désormais, après deux produits à égalité pour la dixième place, le produit suivant est classé onzième et la numérotation se poursuit séquentiellement sans sauter le rang 11.

Capture d’écran illustrant la table décrite à l’aide du rang DENSE.

Dans ce visuel, la ligne de total de la mesure Product Quantity Rank affiche un, car le total de tous les produits est également classé et il n’y a qu’une seule valeur.

Capture d’écran montrant que le total de la mesure Product Quantity Rank est de 1.

Pour éviter de classer le total, la mesure peut renvoyer BLANK à l’aide de la fonction HASONEVALUE, sauf si un seul produit est filtré :

Product Quantity Rank =
IF(
    HASONEVALUE('Product'[Product]),
    RANKX(
        ALL('Product'[Product]),
        [Quantity],
        ,
        ,
        DENSE
    )
)

Désormais, le total pour Product Quantity Rank est vide.

Capture d’écran montrant que le total de la mesure Product Quantity Rank est vide.

La fonction HASONEVALUE vérifie si la colonne Product a une valeur unique dans le contexte de filtre. Cela est vrai pour chaque groupe de produits, mais pas pour le total, qui représente tous les produits.

Les fonctions d’itérateur fournissent de puissants moyens pour résumer, agréger et classer les données dans les modèles Power BI. Elles prennent en charge des calculs complexes et vous permettent de contrôler le niveau de détail de vos états.