DAX : La différence entre SUM et SUMX

En DAX, il existe souvent plusieurs manières de parvenir à un même résultat. Et cela, peut parfois semer la confusion dans l’esprit de l’utilisateur novice.
SUM et SUMX font parties des premières fonctions que l’on apprend lorsque l’on débute en DAX, et  je me suis moi-même longtemps interrogé : « Pourquoi avoir créé ces deux fonctions qui produisent exactement les mêmes résultats ? » 

Alors, quelle est la différence entre SUM et SUMX ?
Il est vrai que très souvent, les deux fonctions donneront le même résultat. Toutefois, la manière dont l’une et l’autre parvienne à ce résultat est comlétement opposée. Ainsi, dans certains scénarios il sera plutôt recommandé d’utiliser SUM, et dans d’autres scénarios, vous n’aurez pas d’autres alternatives que d’utiliser SUMX

Dans cet article, nous allons justement tenté d’identifier dans quels cas recourir à l’une ou l’autre des fonctions


SUM

SUM est une fonction d’agrégation qui, après application du contexte de filtre, additionne tous les nombres de la colonne qu’elle reçoit en paramètre.

Syntaxe : SUM(<NomColonne>) 

ARGUMENT ATTRIBUT DESCRIPTION
NomColonne  

La colonne qui contient les nombres à additionner.

SUM n’accepte qu’un seul argument : une colonne qui contient des valeurs numériques (nombres entiers, nombres décimals, devises etc.)

Nous avons dans la table Ventes une colonne Quantité.
Supposons que nous souhaitions calculer le montant total des quantités vendues en utilisant SUM dans une mesure que nous appelerons [Qté Totale SUM] :

Qté Totale SUM = SUM( Ventes[Quantité] )


Ajoutons sur le canvas le visuel Table avec pour valeurs la colonne Produits[Produit] et la mesure [Qté Totale SUM]

Cela nous donne la quantité totale par produit. 
SUM fonctionne aussi simplement que cela et nous avons déjà fait le tour de la fonction.

Voyons maintenant ce qu’il se passe du côté de SUMX.

SUMX

Retourne la somme d’une expression évaluée pour chaque ligne d’une table.

Syntaxe : SUMX(<Table>; <Expression>) 

ARGUMENT ATTRIBUT DESCRIPTION
Table  

La table qui contient les lignes pour lesquelles l’expression
doit être évaluée.

Expression  

L’expression à évaluer pour chaque ligne de la table.

Table : Il peut s’agir d’une table physique présente dans votre modèle de données ou d’une fonction DAX qui retourne une table (ex. : FILTER, ALL etc.)
Expression : Cela peut-être : une colonne numérique (ex. : Ventes[Quantité]); une opération (ex. : Ventes[Quantité] * (1+10%)); une formule (ex. : DISTINCTCOUNT( Ventes[ID Client] )) ou encore une mesure (ex. : [Qté Totale])

Vous remarquerez l’emphase sur le terme « ligne« . En effet, SUMX est non seulement une fonction d’agrégation, mais est aussi et en premier lieu un itérateur. En clair, cela signifie que SUMX va pouvoir « lire » chaque ligne de la table qu’elle reçoit en premier argument et évaluer pour chacune d’elle l’expression qu’elle aura reçu en second argument. En DAX, la plupart des fonctions itératives sont identifiables grâce à lettre X qu’elles portent à la fin de leur nom (ex. : AVERAGEX, RANKX, MINX etc.).

En interne, les calculs dans SUMX se font en deux étapes :

1. L’évaluation ligne par ligne : D’abord SUMX évalue l’expression (du 2e argument) pour chaque ligne de la table (du 1ère argument) et garde en mémoire le résultat obtenu pour chaque ligne.

2.  L’agrégation : Enfin, elle additionne tous ces résultats intérmédiaires qu’elle avait gardé en mémoire àl’étape 1.

Voyons comment SUMX peut-être mise en oeuvre à travers deux scénarios.

Scénario 1 : La colonne à agréger existe physiquement dans le modèle de données (ex. : Ventes[Quantité])

Créons une mesure calculant les quantités vendues mais avec SUMX cette fois :

Qté Totale SUMX = SUMX( Ventes; Ventes[Quantité] )

On constate que SUMX et SUM produisent le même résultat.

Ainsi, lorsque la colonne pour laquelle vous souhaitez agréger les valeurs existe physiquement dans votre modèle de données, vous pourrez indifférement utiliser SUM ou SUMX. Dans ce scénario, les deux fonctions sont complétement identiques tant en terme de résultat que de performance.

Scénario 2 : La colonne à agéger n’existe pas physiquement dans le modèle de données

Supposons maintenant que nous souhaitions calculer le montant total des ventes non plus en quantité mais en €. Nous avons dans notre modèle, les colonnes Ventes[Quantité] et Ventes[Prix unitaire], mais nous n’avons pas de colonne « Montant Ventes » que l’on aurait pu ensuite facilement agréger par SUM.

Une solution acceptable (mais pas optimale) consisterait à créer une colonne calculée dans la table Ventes :

Montant Ligne = Ventes[Quantité] * Ventes[Prix unitaire]

Puis ensuite créer une mesure en utilisant SUM :

Montant Ventes = SUM( Ventes[Montant Ligne] )

On parviendrait au résultat voulu mais avec un inconvénient : La création d’une colonne calculée (qui a le potentielle d’alourdir le poids de votre fichier)

Créons maintenant la mesure [Montant Ventes] de manière plus optimale avec SUMX  :

Montant Ventes SUMX = SUMX( Ventes; Ventes[Quantité] * Ventes[Prix unitaire] )

Cela produit le résultat escompté avec l’avantage de ne pas avoir à créer de colonne calculée au préalable.

Cela parceque SUMX, en qualité d’itérateur, est capable d’évaluer l’expression Ventes[Quantité] * Ventes[Prix unitaire] pour chaque ligne de la table Ventes, comme l’aurait fait une colonne calculée. Elle garde en mémoire le résultat obtenue à chaque ligne, puis pour finir, elle fait l’agregation de ces dits résultats comme l’aurait fait SUM.

Conclusion

On préférera utiliser la fonction SUM lorsque la colonne dont il faut agréger les valeurs existe dans le modèle de donnée. N’acceptant qu’un seul argument, SUM est plus rapide à écrire que SUMX dans le même scénario.

À l’inverse, si la colonne dont il faut agréger les valeurs n’existe pas dans le modèle de données, on préférera utiliser SUMX qui nous évitera d’avoir à créer cette dite colonne sous forme de colonne calculée.

 

Ressources supplémentaires :

https://docs.microsoft.com/fr-fr/dax/sum-function-dax
https://docs.microsoft.com/fr-fr/dax/sumx-function-dax

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *