Colonnes calculées et mesures DAX
Passer des données brutes aux indicateurs : comprendre la différence entre colonne et mesure, lire et écrire une formule DAX, puis utiliser les fonctions qui servent tous les jours.
⬇Fichier d’exemple Excel
Ce module reprend le modèle construit au module 3 Modéliser les données. Importez les quatre tableaux T_Ventes, T_Clients, T_Produits et T_Calendrier, puis créez les relations 1:* avant de commencer.
A3I_PowerBI_Modele_Ventes.xlsx
280 ventes de formations en 2025, 20 clients, 12 formations, calendrier complet. Tous les exemples et les résultats attendus de cette page sont calculés sur ce fichier.
Télécharger le fichier4.1Définir mesures et colonnes
Les deux s’écrivent en DAX, mais elles ne calculent pas au même moment ni au même endroit.
- Choisir entre colonne calculée et mesure
- Créer l’une et l’autre dans Power BI Desktop
- Ranger ses mesures dans une table dédiée
| Colonne calculée | Mesure | |
|---|---|---|
| Calculée | Une fois, à l’actualisation, ligne par ligne | À chaque affichage, selon les filtres du visuel |
| Stockée | Oui, elle alourdit le fichier | Non, seule la formule est enregistrée |
| Contexte | Contexte de ligne : elle « voit » la ligne en cours | Contexte de filtre : elle « voit » ce que le visuel filtre |
| Usage typique | Classer, regrouper, filtrer, axe de graphique | Totaux, ratios, moyennes, comparaisons |
| Exemple | Délai = DATEDIFF(Ventes[DateCommande], Ventes[DateLivraison], DAY) | CA = SUM(Ventes[Montant]) |
Créer une colonne calculée
- Dans le volet Données, sélectionnez la table Ventes
- Saisissez
Délai = DATEDIFF(Ventes[DateCommande], Ventes[DateLivraison], DAY)puis Entrée - Vérifiez dans la : chaque ligne a sa valeur
Créer une mesure
- Sélectionnez la table qui accueillera la mesure
- Saisissez
CA = SUM(Ventes[Montant])puis Entrée - Dans , choisissez le format Devise € et 0 décimale
, nommez la table _Mesures et chargez-la vide. Déplacez-y vos mesures (). Elles restent groupées en haut du volet Données.
Une colonne calculée qui fait un total ne réagit pas aux segments. Si le résultat doit changer quand on filtre, c’est une mesure.
4.2Introduction au langage DAX
DAX (Data Analysis Expressions) est le langage de formules de Power BI, de Power Pivot et d’Analysis Services. Sa syntaxe ressemble à celle d’Excel, mais il travaille sur des tables et des colonnes, jamais sur des cellules.
Les règles d’écriture
| Élément | Écriture | Exemple |
|---|---|---|
| Colonne | 'Table'[Colonne] (apostrophes si espace) | Ventes[Montant] |
| Mesure | [Mesure], sans nom de table | [CA] |
| Texte | Entre guillemets doubles | "Data" |
| Concaténation | & | Clients[IdClient] & " – " & Clients[Ville] |
| Et / Ou | && et || | Ventes[Quantite] >= 2 && Ventes[PrixUnitaire] > 1000 |
| Liste de valeurs | IN { } | Produits[Categorie] IN {"Data", "PAO"} |
| Commentaire | // en fin de ligne | // CA hors orphelins |
Variables : VAR et RETURN
Une variable stocke un résultat intermédiaire. La formule devient lisible et le calcul n’est fait qu’une fois.
Part du CA =
VAR CaVisuel = [CA]
VAR CaTotal = CALCULATE([CA], ALL(Produits))
RETURN
DIVIDE(CaVisuel, CaTotal)
Maj + Entrée passe à la ligne dans la barre de formule. Ctrl + molette zoome. Une formule sur plusieurs lignes, une idée par ligne, se relit et se corrige bien plus vite.
4.3Les éléments clés d’une fonction
Toute formule DAX suit le même schéma. Savoir le lire permet de comprendre l’aide en ligne et les messages d’erreur.
| Élément | Rôle |
|---|---|
| ① Nom | Ce qui apparaît dans le volet Données. Il doit être unique dans le modèle |
| ② Fonction | En majuscules par convention. L’IntelliSense propose la liste dès la première lettre |
| ③ Arguments obligatoires | Séparés par des virgules, dans l’ordre attendu par la fonction |
| ④ Argument facultatif | Noté entre crochets dans l’aide : DIVIDE(numérateur, dénominateur [, autreRésultat]) |
Fonctions d’agrégation et itérateurs « X »
SUM(Ventes[Montant]) additionne une colonne existante. SUMX(Ventes, Ventes[Quantite] * Ventes[PrixUnitaire]) parcourt la table ligne par ligne, calcule l’expression, puis additionne. Avec un itérateur, la colonne Montant n’est plus nécessaire.
Le premier argument d’un itérateur est une table, pas une colonne. SUMX(Ventes[Montant], …) renvoie une erreur.
4.4Maîtriser les principales fonctions DAX
Cinq familles couvrent l’essentiel des besoins. Chaque exemple fonctionne sur le fichier du module.
Agrégation
| Fonction | Exemple | Résultat sur le fichier |
|---|---|---|
SUM | CA = SUM(Ventes[Montant]) | 588 160 € |
COUNTROWS | Nb ventes = COUNTROWS(Ventes) | 280 |
DISTINCTCOUNT | Nb clients = DISTINCTCOUNT(Ventes[IdClient]) | 21 (dont C999) |
AVERAGE / AVERAGEX | Délai moyen = AVERAGE(Ventes[Délai]) | 20,1 jours |
SUMX | CA bis = SUMX(Ventes, Ventes[Quantite] * Ventes[PrixUnitaire]) | 588 160 € |
Logiques
Taille vente = // colonne calculée dans Ventes
SWITCH(
TRUE(),
Ventes[Montant] >= 3000, "Grosse",
Ventes[Montant] >= 1000, "Moyenne",
"Petite"
)
IF(condition, si_vrai, si_faux) pour un test simple, SWITCH(TRUE(), …) dès qu’il y a plus de deux cas. Résultat attendu : 57 grosses, 157 moyennes, 66 petites ventes. Autres fonctions utiles : AND, OR, NOT, ISBLANK, IFERROR.
Texte
| Fonction | Exemple (colonne calculée) | Résultat |
|---|---|---|
& / CONCATENATE | Client = Clients[IdClient] & " – " & Clients[RaisonSociale] | C001 – Boulangerie Delattre |
UPPER | Ville MAJ = UPPER(Clients[Ville]) | HESDIN |
LEFT / RIGHT / MID | Logiciel = LEFT(Produits[Formation], SEARCH(" ", Produits[Formation]) - 1) | Excel |
FORMAT | Mois commande = FORMAT(Ventes[DateCommande], "mmmm yyyy") | septembre 2025 |
LEN | Longueur = LEN(Clients[RaisonSociale]) | 20 |
FORMAT renvoie du texte : une colonne « septembre 2025 » se trie par ordre alphabétique. Triez-la avec sur Calendrier[AnneeMois].
Dates
| Fonction | Exemple | Usage |
|---|---|---|
YEAR, MONTH, DAY | Mois = MONTH(Ventes[DateCommande]) | Extraire une partie de date |
DATEDIFF | DATEDIFF(Ventes[DateCommande], Ventes[DateLivraison], DAY) | Écart entre deux dates |
TODAY, EOMONTH | Fin de mois = EOMONTH(Ventes[DateCommande], 0) | Dates de référence |
TOTALYTD | CA cumulé = TOTALYTD([CA], Calendrier[Date]) | Cumul depuis le 1er janvier |
SAMEPERIODLASTYEAR | CA N-1 = CALCULATE([CA], SAMEPERIODLASTYEAR(Calendrier[Date])) | Comparaison avec l’an passé |
Les fonctions d’intelligence temporelle (TOTALYTD, DATEADD…) exigent une table de dates continue. Sélectionnez Calendrier puis , colonne Date. Résultat attendu : CA cumulé de 144 110 € fin mars et 292 270 € fin juin.
Filtrage
CA Data =
CALCULATE([CA], Produits[Categorie] = "Data") // 98 630 €
% du CA =
DIVIDE([CA], CALCULATE([CA], ALL(Produits))) // Data : 16,8 %
CA orphelins =
CALCULATE([CA], ISBLANK(Clients[RaisonSociale])) // 10 510 €
| Fonction | Ce qu’elle fait |
|---|---|
CALCULATE | Recalcule une expression en ajoutant ou remplaçant des filtres. C’est la fonction la plus importante de DAX |
FILTER | Renvoie une table filtrée par une condition complexe : FILTER(Ventes, Ventes[Quantite] * Ventes[PrixUnitaire] > 3000) |
ALL / REMOVEFILTERS | Ignore les filtres d’une table ou d’une colonne, pour obtenir un total de référence |
ALLEXCEPT | Ignore tous les filtres sauf ceux des colonnes citées |
USERELATIONSHIP | Active une relation inactive le temps du calcul (voir module 3) |
DIVIDE([CA], [Nb ventes]) renvoie une valeur vide au lieu d’une erreur quand le dénominateur vaut zéro. Les visuels restent propres.
✎Exercices
Fichier de travail : A3I_PowerBI_Modele_Ventes.xlsx. Les résultats attendus permettent de vous corriger seul.
Premières mesuresDécouverte
Créez la table _Mesures, puis CA, Nb ventes, Nb clients et Panier moyen avec DIVIDE. Affichez-les dans des cartes. Attendu : 588 160 €, 280, 21, 2 100,57 €.
Colonnes de classementApplication
Ajoutez dans Ventes les colonnes Délai et Taille vente. Construisez un histogramme du CA par Taille vente et une carte du délai moyen. Attendu : 57 / 157 / 66 ventes, 20,1 jours.
Analyse filtréeMaîtrise
Marquez Calendrier comme table de dates. Créez CA Data, % du CA, CA cumulé et CA orphelins. Placez-les dans une matrice par catégorie et par mois. Attendu : 98 630 €, 16,8 %, 292 270 € fin juin, 10 510 €.
✓Quiz de validation
Cliquez sur une réponse. Score : 0 / 5