SUMX dans Power BI : additionner ligne à ligne en DAX
- Groupe Kronoscope
- il y a 7 jours
- 4 min de lecture
En DAX, la fonction SUMX calcule une expression pour chaque ligne d'une table, puis additionne les résultats.
C'est la fonction du calcul ligne à ligne. SUM, lui, se contente d'additionner une colonne qui existe déjà.
Exemple :
Table Ventes, trois lignes : 10 × 20 €, puis 3 × 50 €, puis 5 × 12 €.
SUMX ( Ventes, Ventes[Qte] * Ventes[Prix] ) = 200 + 150 + 60 = 410 €
Chaque ligne est calculée d'abord. La somme vient ensuite.
L'écriture SUM ( Qte ) × SUM ( Prix ) donnerait 18 × 82, soit 1 476 €.
Ce chiffre n'a aucun sens métier. C'est exactement le problème que SUMX règle.

Fonction SUMX : syntaxe et valeur renvoyée
Syntaxe
SUMX ( <table>, <expression> )
Les deux arguments, dans l'ordre
Le premier argument est la table parcourue. Une table du modèle, ou une expression qui renvoie une table.
Le second est l'expression évaluée pour chaque ligne de cette table.
Les deux sont obligatoires. C'est la différence d'écriture avec SUM, qui n'attend qu'une colonne.
L'expression peut combiner plusieurs colonnes, une constante ou une mesure.
Ce que SUMX renvoie, et ce qu'il ignore
La fonction renvoie un nombre décimal, calculé dans le contexte de filtre courant.
Seuls les nombres sont pris en compte. Les cellules vides, le texte et les booléens sont écartés.
Aucun message ne le signale. Une colonne mal typée fausse donc le total en silence.
Sans aucune ligne à parcourir, SUMX renvoie BLANK. Ce n'est pas zéro.
Vous pouvez l'écrire dans une mesure, une colonne calculée, une table calculée ou un calcul visuel.
Exemple : appliquer une remise ligne à ligne
Le cas quantité × prix est connu. Prenons un cas plus parlant en reporting commercial.
Chaque ligne de vente porte son propre taux de remise, négocié au coup par coup.
CA net =
SUMX (
Ventes,
Ventes[Quantite] * Ventes[PrixUnitaire] * ( 1 - Ventes[TauxRemise] )
)Le taux change à chaque ligne. Aucune remise moyenne ne peut le remplacer.
Appliquer un taux moyen au chiffre d'affaires total donne un autre résultat.
L'écart se creuse dès que les grosses lignes portent les remises les plus fortes.
Quand le prix vient d'une autre table
SUMX crée un contexte de ligne sur la table parcourue, et sur elle seule.
Les colonnes des autres tables restent hors de portée de l'expression.
RELATED va chercher la valeur du côté « un » de la relation.
Marge =
SUMX (
Ventes,
Ventes[Quantite] * ( Ventes[PrixUnitaire] - RELATED ( Produits[CoutUnitaire] ) )
)Sans RELATED, la formule refuse de se valider. Le message parle de contexte indéterminé.
Il faut évidemment une relation active entre les deux tables.
La mesure SUMX à copier dans votre modèle
Voici la version générique. Trois éléments à adapter : la table et les deux colonnes.
Montant total =
SUMX (
'VotreTable',
'VotreTable'[Quantite] * 'VotreTable'[PrixUnitaire]
)Pour ne parcourir qu'une partie des lignes, filtrez la table passée en premier argument.
Montant filtre =
SUMX (
FILTER ( 'VotreTable', 'VotreTable'[Statut] = "Valide" ),
'VotreTable'[Quantite] * 'VotreTable'[PrixUnitaire]
)FILTER ajoute un parcours de table. Quand la condition est simple, préférez CALCULATE.
Testez SUMX sur vos propres données
Pas besoin de fichier d'exercice ni de modifier votre rapport. Trois étapes suffisent.
Ouvrez la vue Requête DAX
Cliquez sur l'icône de la vue Requête DAX, dans le ruban de gauche de Power BI Desktop.
Collez la requête
Copiez le bloc EVALUATE ci-dessous, puis remplacez la table et les deux colonnes.
Exécutez
Le résultat s'affiche sous l'éditeur, calculé sur vos données réelles.
EVALUATE
ROW (
"Montant total",
SUMX ( 'VotreTable', 'VotreTable'[Quantite] * 'VotreTable'[PrixUnitaire] )
)Votre modèle reste intact. Une requête EVALUATE ne crée aucune mesure.
Votre résultat est faux ? Les pièges de SUMX
La table parcourue n'est pas la bonne
SUMX calcule autant de fois qu'il y a de lignes dans la table du premier argument.
Itérer la table des produits au lieu de la table des ventes change complètement le résultat.
Le calcul est alors fait une fois par produit, et non une fois par ligne de vente.
La règle tient en une phrase : itérez la table qui porte le détail du calcul.
C'est le piège le plus fréquent, et le plus difficile à repérer. Le total reste plausible.
Une mesure dans SUMX déclenche une transition de contexte
Une mesure appelée dans l'expression est évaluée pour la ligne en cours.
Le contexte de ligne se transforme alors en contexte de filtre. C'est la transition de contexte.
CA des clients actifs =
SUMX (
Clients,
[CA]
)Cette mesure additionne le CA de chaque client, un client après l'autre.
L'écriture est correcte. Elle est aussi coûteuse : le calcul repart à chaque ligne.
Sur une table à forte cardinalité, la mesure devient lente sans prévenir.
SUM ou SUMX : la question qui tranche
Une seule question sépare les deux fonctions.
La valeur à additionner existe-t-elle déjà dans une colonne ?

SUM
La colonne existe déjà. Lecture directe, sans parcours ligne à ligne.
SUMX
Le calcul précède la somme. Une ligne à la fois, puis le total.
Le détail de la première est traité dans notre article sur la fonction SUM.
SUMX a un coût réel. Il parcourt la table à chaque rafraîchissement du visuel.
Quand préparer la colonne en amont
Si le calcul ne dépend d'aucun filtre, il peut être figé une fois pour toutes.
Une colonne créée dans Power Query est calculée à l'actualisation, pas à l'affichage.
Un simple SUM sur cette colonne remplace alors SUMX, sans rien perdre.
Gardez SUMX quand l'expression dépend d'une sélection de l'utilisateur.
Dernier point issu de la documentation Microsoft : SUMX n'est pas prise en charge en DirectQuery dans une colonne calculée ou une règle RLS.
Questions fréquentes sur SUMX
SUMX peut-il combiner plusieurs colonnes ?
Oui. L'expression accepte tout calcul portant sur les colonnes de la table parcourue.
Quelle différence entre SUMX et CALCULATE ?
SUMX parcourt des lignes. CALCULATE modifie un contexte de filtre. Les deux se combinent souvent.
SUMX est-il plus lent que SUM ?
Oui. SUM lit une colonne compressée, quand SUMX évalue une expression ligne par ligne.
Peut-on utiliser SUMX sans relation entre les tables ?
Oui, mais RELATED ne fonctionnera pas. Il faudra alors LOOKUPVALUE ou TREATAS.



