Effectuer un transfert de contexte
Que se passe-t-il lorsqu’une expression de mesure ou une mesure est évaluée dans le contexte de ligne ? Ce scénario peut se produire dans une formule de colonne calculée ou lors de l’évaluation d’une expression dans une fonction d’itérateur.
Dans l’exemple suivant, vous allez ajouter une colonne calculée à la table Customer pour classer les clients dans une catégorie de fidélité. Le scénario est simple : si le chiffre d’affaires produit par le client est inférieur à 2 500 $, le client est classé dans la catégorie Low ; sinon, il est classé dans la catégorie High.
Customer Segment =
VAR CustomerRevenue = SUM(Sales[Sales Amount])
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
Sur la Page 4 de l’état, ajoutez la colonne Customer Segment comme légende du camembert.
Notez qu’il n’existe qu’une seule valeur Customer Segment. En effet, la formule de colonne calculée produit un résultat incorrect : chaque client se voit affecter la valeur High, car l’expression SUM(Sales[Sales Amount]) n’est pas évaluée dans un contexte de filtre. Par conséquent, chaque client est évalué sur la somme de toutes les valeurs de la colonne Sales Amount de la table Sales.
Pour forcer l’évaluation de l’expression SUM(Sales[Sales Amount])pour chaque client, un transfert de contexte est nécessaire pour appliquer les valeurs de la colonne de contexte de la ligne au contexte de filtre. Vous pouvez effectuer ce transfert à l’aide de la fonction CALCULATE sans transmettre d’expressions de filtre.
Modifiez la définition de colonne calculée afin qu’elle produise le résultat correct.
Customer Segment =
VAR CustomerRevenue = CALCULATE(SUM(Sales[Sales Amount]))
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
Dans le visuel Camembert, ajoutez la nouvelle colonne calculée au puits Légende et vérifiez que deux segments à secteurs s’affichent désormais.
Dans ce cas, la fonction CALCULATE applique les valeurs de contexte de ligne en tant que filtres, appelés transfert de contexte. Pour être exact, le processus ne fonctionne pas vraiment de cette façon quand une colonne unique se trouve dans la table. Lorsqu’une colonne unique se trouve dans la table, il vous suffit d’appliquer un filtre à cette colonne afin que le transfert se produise. Dans ce cas, Power BI applique un filtre sur la colonne CustomerKey pour la valeur dans le contexte de ligne.
Si vous référencez des mesures dans une expression évaluée dans le contexte de ligne, le transfert de contexte est automatique. Ainsi, vous n’avez pas besoin de transmettre des références de mesure à la fonction CALCULATE.
Modifiez la définition de colonne calculée, qui référence la mesure Revenue, et notez qu’elle continue à produire le résultat correct.
Customer Segment =
VAR CustomerRevenue = [Revenue]
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
À présent, vous pouvez terminer la formule de la mesure Sales Commission. Pour générer un total, vous devez itérer sur toutes les régions dans le contexte de filtre à l’aide d’une fonction d’itérateur. L’expression de la fonction d’itérateur doit transférer le contexte de ligne au contexte de filtre à l’aide de la fonction CALCULATE. Notez qu’il n’est plus nécessaire de tester si une seule valeur de la colonne Country de la table Sales Territory se trouve dans le contexte de filtre, car on sait qu’elle filtre selon un seul pays/une seule région (car elle itère sur les régions dans le contexte de filtre et qu’une région appartient à un seul pays/une seule région).
Basculez vers la Page 3 de l’état, puis modifiez la définition de mesure Sales Commission pour utiliser la fonction d’itérateur SUMX :
Sales Commission =
SUMX(
VALUES('Sales Territory'[Region]),
CALCULATE(
[Revenue]
* IF(
VALUES('Sales Territory'[Country]) = "United States",
0.15,
0.1
)
)
)
Le visuel Table affiche à présent un total Sales Commission pour toutes les régions.