2.4 · Introduction au DAX : SUM, AVERAGE, COUNT

Niveau 2 · Modèle & DAX

2.4Introduction au DAX : SUM, AVERAGE, COUNT

Objectif : Écrire un socle de mesures propres, formatées et réutilisables — et apprivoiser CALCULATE sur un cas simple.
Temps estimé : 20 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • DAX = le langage de calcul de Power BI (le même que Power Pivot) : on commence par SUM, AVERAGE, COUNT/COUNTROWS, MIN, MAX.
  • DIVIDE remplace « / » systématiquement : la division blindée, plus jamais d'erreur de division par zéro.
  • CALCULATE évalue une expression en modifiant le filtre — « le CA, mais pour Paris » ; sa maîtrise complète occupe le niveau 3.

Mini-cas filé — Zineb écrit son socle de mesures

Zineb, contrôleuse de gestion dans une PME agroalimentaire à Alger, veut trois indicateurs : le chiffre d'affaires, le nombre de ventes et le panier moyen. Elle écrit un socle de mesures : Total CA = SUM(Ventes[Montant]), Nb Ventes = COUNTROWS(Ventes), puis Panier moyen = DIVIDE([Total CA], [Nb Ventes]) — remarquant qu'une mesure en référence une autre. Elle formate chacune (€, séparateur de milliers, décimales). Puis elle apprivoise CALCULATE : CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris"), et Part Paris = DIVIDE([CA Paris], [Total CA]) formatée en %. Trois mesures qui s'emboîtent : Zineb écrit déjà du vrai DAX.

Cas autonome de cette section : il revient dans le cours, le schéma, le script et le défi 48h de la section 2.4.

1. Les agrégations de base

Le DAX (Data Analysis Expressions) est le langage de calcul de Power BI — le même que Power Pivot dans Excel. On commence par les agrégations simples : SUM, AVERAGE, COUNT/COUNTROWS, MIN, MAX, et DIVIDE — la division blindée qui évite les erreurs de division par zéro. Zineb note la première bonne habitude : les mesures se construisent en briques, une mesure peut (doit) en référencer d'autres.

2. Un aperçu de CALCULATE

Puis la fonction qui change tout : CALCULATE, qui évalue une expression en modifiant le filtre. « Le CA, mais seulement pour Paris » : CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris"). Sa maîtrise complète occupe le niveau 3 ; ici on l'apprivoise sur un cas simple. Zineb se répète la phrase : « calcule ceci, avec ce filtre ».

3. Nommer et formater

Bonnes habitudes dès le premier jour : nommer clairement chaque mesure et la formater (€, %, décimales) — un rapport aux nombres bruts n'est pas fini. On utilise DIVIDE plutôt que « / », et on range les mesures dans une table dédiée. Zineb formate chaque mesure à sa création, sans exception.

Erreur d'interprétation fréquente : « DAX, c'est exactement Excel : je divise avec « / », je laisse les nombres bruts, et CALCULATE s'apprend en deux minutes ». Non, triple erreur. La syntaxe ressemble à Excel, mais la logique diffère : DAX calcule dans des contextes (le visuel, les filtres), pas dans des cellules. On divise avec DIVIDE pour éviter la division par zéro. Et on formate chaque mesure à la création — des nombres bruts font un rapport non fini. CALCULATE, elle, se maîtrise au niveau 3.
Le DAX de base Des briques qui s'emboîtent : agrégations, DIVIDE, puis CALCULATE. AgrégationsSUM, AVERAGE, COUNTROWS, MIN, MAX+DIVIDEDivision blindée (plus de /0)+CALCULATE« Calcule ceci, avec ce filtre » Formater chaque mesure à la création (€, %, décimales).
Des briques qui s'emboîtent : agrégations, DIVIDE, puis CALCULATE.
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Zineb, contrôleuse de gestion à Alger, écrit ses premières mesures DAX : les agrégations de base SUM, AVERAGE, COUNTROWS, MIN, MAX sur des colonnes — et DIVIDE pour la division blindée, plus jamais d'erreur de division par zéro. 2) Elle compose un socle en briques : Total CA = SUM(Ventes[Montant]), Nb Ventes = COUNTROWS(Ventes), Panier moyen = DIVIDE([Total CA], [Nb Ventes]) — une mesure en référence une autre. 3) Elle apprivoise CALCULATE — « le CA, mais pour Paris » : CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris") — et retient les bonnes habitudes : nommer clairement et formater chaque mesure. Leçon : construire en briques, DIVIDE systématiquement, formater à la création.

🔎 Exemple concret — 🔎 Exemple concret — Trois mesures qui s'emboîtent

Le socle DAX de Zineb, du plus simple au plus composé :

Total CA     = SUM(Ventes[Montant])
Nb Ventes    = COUNTROWS(Ventes)
Panier moyen = DIVIDE([Total CA], [Nb Ventes])
CA Paris     = CALCULATE([Total CA], Ventes[Ville] = "Paris")
Part Paris   = DIVIDE([CA Paris], [Total CA])   // formatée en %

Lecture : [Panier moyen] référence [Total CA] et [Nb Ventes] : les mesures se construisent en briques.

Leçon : DIVIDE évite la division par zéro ; CALCULATE ajoute un filtre sans retaper la formule.

Vocabulaire de la section

DAX
Le langage des mesures et colonnes calculées : des fonctions type Excel, mais évaluées dans un contexte de modèle.

Exemple simple : Zineb écrit ses premières mesures en DAX.

Ce que ce n'est pas : une formule Excel qui ne regarde que des cellules.

Réflexe : DAX = des calculs dans des contextes.

SUM / AVERAGE / MIN / MAX
Les agrégations de base sur une colonne : SUM(Ventes[Montant]).

Exemple simple : Zineb calcule Total CA = SUM(Ventes[Montant]).

Ce que ce n'est pas : une somme tapée à la main dans un visuel.

Réflexe : une colonne à agréger → SUM, AVERAGE, MIN, MAX.

COUNTROWS vs COUNT
COUNTROWS(Ventes) compte les lignes d'une table ; COUNT compte les valeurs non vides d'une colonne.

Exemple simple : Zineb compte ses ventes avec COUNTROWS(Ventes).

Ce que ce n'est pas : une somme de montants, qui n'est pas un comptage.

Réflexe : compter des événements → COUNTROWS(table).

DIVIDE
DIVIDE(numérateur; dénominateur; [si_zéro]) : la division blindée, plus d'erreur par zéro.

Exemple simple : Zineb écrit Panier moyen = DIVIDE([Total CA], [Nb Ventes]).

Ce que ce n'est pas : une division avec « / » qui peut renvoyer une erreur.

Réflexe : toujours DIVIDE plutôt que « / ».

CALCULATE
LA fonction du DAX : évalue une expression dans un contexte de filtre modifié.

Exemple simple : Zineb écrit CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris").

Ce que ce n'est pas : une mesure qui additionne tout sans filtrer.

Réflexe : « calcule ceci, avec ce filtre ».

En pratique — En pratique — Votre socle de mesures

  1. Créez les mesures de base : Total CA = SUM(Ventes[Montant]), Nb Ventes = COUNTROWS(Ventes), Panier moyen = DIVIDE([Total CA], [Nb Ventes]) — notez la réutilisation de mesures dans une mesure, comme Zineb.
  2. Formatez chaque mesure (onglet Outils de mesure) : € pour les montants, séparateur de milliers, 0 ou 1 décimale.
  3. Première CALCULATE : CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris") — posez-la dans une carte à côté du Total CA.
  4. Encore une : Part Paris = DIVIDE([CA Paris], [Total CA]) formatée en % — trois mesures qui s'emboîtent.
Un socle de mesures propres, formatées, réutilisables — et CALCULATE apprivoisée sur un cas simple.

Script pas-à-pas — écrire son socle DAX comme Zineb (8 min)

1) Nouvelle mesure : Total CA = SUM(Ventes[Montant]). 2) Nouvelle mesure : Nb Ventes = COUNTROWS(Ventes). 3) Panier moyen = DIVIDE([Total CA], [Nb Ventes]) — vous réutilisez des mesures dans une mesure. 4) Formatez chaque mesure (€, milliers, décimales). 5) CALCULATE : CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris"), puis Part Paris = DIVIDE([CA Paris], [Total CA]) en %. 6) Rangez tout dans une table « _Mesures ».

Si vous hésitez sur une fonction DAX, la référence dax.guide (SQLBI) documente chacune avec exemples.

Modèle copier-coller — mon socle de mesures

Total CA     = SUM(Ventes[Montant])
Nb Ventes    = COUNTROWS(Ventes)
Panier moyen = DIVIDE([Total CA], [Nb Ventes])
CA Paris     = CALCULATE([Total CA], Ventes[Ville] = "Paris")
Part Paris   = DIVIDE([CA Paris], [Total CA])   // %
Règles : DIVIDE (jamais « / ») ; formater chaque mesure ; table « _Mesures ».

Chiffre d'affaires

Zineb écrit Total CA = SUM(Ventes[Montant]) : la mesure de base de tout son tableau de bord.

Nombre de ventes

Zineb compte ses transactions avec Nb Ventes = COUNTROWS(Ventes), plus fiable qu'un COUNT de colonne.

Panier moyen

Panier moyen = DIVIDE([Total CA], [Nb Ventes]) : une mesure composée qui s'appuie sur deux autres.

Le CA de Paris

CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris") : le même CA, mais filtré sur Paris.

✓ Bonnes pratiques

  • Construire les mesures en briques (une mesure en référence d'autres).
  • DIVIDE plutôt que « / » systématiquement.
  • Formater chaque mesure à la création (€, %, décimales).

✗ Pièges fréquents

  • Diviser avec « / » (risque d'erreur de division par zéro).
  • Laisser des nombres bruts non formatés (rapport non fini).
  • Croire maîtriser CALCULATE d'un coup (sa profondeur est au niveau 3).

Points clés à retenir

  • Les mesures se construisent en briques : une mesure peut (doit) en référencer d'autres.
  • DIVIDE remplace « / » systématiquement : la division par zéro n'existe plus.
  • CALCULATE = « calcule ceci, avec ce filtre » : la phrase à se répéter.
  • Formatez chaque mesure à la création : un rapport aux nombres bruts n'est pas fini.

Défi 48h — appliquez demain

Composez le socle de Zineb : écrivez Total CA = SUM(Ventes[Montant]), Nb Ventes = COUNTROWS(Ventes) et Panier moyen = DIVIDE([Total CA], [Nb Ventes]), formatez chaque mesure, puis ajoutez CA Paris = CALCULATE([Total CA], Ventes[Ville] = "Paris"). Rangez le tout dans une table « _Mesures ».

Checklist sortie de section
  • J'écris des mesures DAX avec SUM, AVERAGE et COUNTROWS.
  • J'utilise DIVIDE au lieu de « / » et je formate chaque mesure.
  • J'écris une CALCULATE simple qui modifie le filtre.
Auto-évaluation 1-5 : est-ce que je construis des mesures en briques sans hésiter ?Auto-évaluation 1-5 : ai-je écrit et formaté un socle de mesures réutilisables ?

Questions fréquentes

DAX ressemble aux formules Excel : est-ce le même langage ?

La syntaxe se ressemble (SUM, AVERAGE, IF existent dans les deux), mais la logique diffère : Excel calcule des cellules, DAX calcule dans des contextes (le visuel, les filtres). Une même mesure donne un résultat différent selon la ville de la barre ou le mois de la colonne. Vos acquis Excel aident pour la syntaxe ; la logique de contexte s'apprend — c'est le saut du niveau 3.

Où apprendre les fonctions DAX au-delà de ce guide ?

La référence officielle et gratuite est dax.guide (par SQLBI) : elle documente chaque fonction avec sa syntaxe et des exemples. Au-delà, SQLBI (Marco Russo et Alberto Ferrari) est la référence mondiale du DAX, et Microsoft Learn propose des parcours structurés qui préparent à la PL-300. Notre section ressources les cite.

Vérifiez votre compréhension

Que fait la fonction CALCULATE en DAX ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 2Questions inédites et durcies pour valider vos acquis