🎯 Énoncé — Mes premières mesures DAX
Cet exercice vous fait écrire vos premières formules DAX. Vous allez créer 2 colonnes calculées et 5 mesures, puis comprendre quand utiliser l'une ou l'autre.
📊 Données utilisées : notre base PostgreSQL NordSupply (vous pourrez réutiliser ce que vous avez chargé au TP 2). Pas besoin du Contoso Sample — nos données sont parfaites pour cet exercice.
📋 Prérequis
- TP 02 terminé (PostgreSQL commerce chargé)
- TP 04 recommandé (relations en place)
🛠️ Étape 1 — Comprendre la différence (théorie)
| Colonne calculée | Mesure | |
|---|---|---|
| Évaluée | Au chargement | À l'affichage |
| Contexte | Ligne (RowContext) | Filtre (FilterContext) |
| Stockage | Dans la table (mémoire) | Aucun |
| Usage | Slicer / catégorie / filtre | Agrégat dans visuel |
| Quand l'utiliser ? | Quand on a besoin d'une valeur par ligne | Quand on a besoin d'un total qui réagit aux filtres |
🛠️ Étape 2 — Créer 2 colonnes calculées
Colonne 1 : dans la table lignes_commande →
Modélisation > Nouvelle colonne
Montant Ligne = lignes_commande[quantite] * lignes_commande[prix_unitaire]
→ Vérifiez que la colonne apparaît bien dans la table avec un montant par ligne.
Colonne 2 : dans la table clients
Segment CA =
SWITCH(
TRUE(),
RELATED... // pas possible ici car clients est dimension !
[CA Client] > 50000, "A - Grand compte",
[CA Client] > 10000, "B - Compte moyen",
"C - Petit compte"
)
⚠️ Problème : [CA Client] est une mesure. On ne peut pas
utiliser une mesure dans une colonne calculée sans précaution. Il faut convertir le contexte
avec CALCULATE. Version corrigée :
Segment CA =
VAR _ca =
CALCULATE(
SUMX( lignes_commande, lignes_commande[quantite] * lignes_commande[prix_unitaire] ),
RELATEDTABLE( commandes )
)
RETURN
SWITCH( TRUE(),
_ca > 50000, "A - Grand compte",
_ca > 10000, "B - Compte moyen",
"C - Petit compte"
)
🛠️ Étape 3 — Créer 5 mesures essentielles
Dans la table _Mesures (créez-la si elle n'existe pas) :
Mesure 1 — CA Total
CA Total =
SUMX( lignes_commande, lignes_commande[quantite] * lignes_commande[prix_unitaire] )
Mesure 2 — Nombre de commandes
Nb Commandes = DISTINCTCOUNT( commandes[id] )
Mesure 3 — Panier moyen
Panier Moyen = DIVIDE( [CA Total], [Nb Commandes], 0 )
Mesure 4 — CA par client (utilise RELATED)
CA Client =
CALCULATE(
[CA Total],
USERELATIONSHIP( commandes[id_client], clients[id] )
)
Mesure 5 — % du total (contexte de filtre)
% du Total =
DIVIDE(
[CA Total],
CALCULATE( [CA Total], ALL( clients ) ),
0
)
🛠️ Étape 4 — Tester dans un visuel
- Insérez un tableau
- Colonnes :
clients[raison_sociale],[CA Total],[% du Total],[Segment CA] - Triez par
[CA Total]décroissant - Activez la mise en forme conditionnelle en barres sur
[% du Total]
🧠 Quiz de validation
- Q1. SUMX vs SUM — quelle est la différence ?
- Q2. Si je crée une colonne
= [CA Total]dans la tableclients, quel sera son résultat sans CALCULATE ? - Q3. À quoi sert
RELATED? - Q4. Pourquoi mettre
ALL( clients )dans la mesure "% du Total" ? - Q5. Une mesure peut-elle être utilisée comme dimension dans un slicer ?
✅ Solution attendue
👉 Cliquez pour voir les réponses
Q1. SUM agrège une colonne déjà existante. SUMX agrège
une expression calculée ligne par ligne (itérateur). Idéal pour quantité × prix_unitaire.
Q2. Le total général du CA répété pour chaque ligne (le contexte de ligne n'active pas
les filtres). Pour avoir le CA par client, il faut CALCULATE( [CA Total] ).
Q3. RELATED permet d'aller chercher une valeur dans une table reliée
(côté "1" de la relation), depuis le côté "*".
Q4. Pour ignorer le filtre actuel sur clients et obtenir le total général comme dénominateur.
Q5. NON. Seules les colonnes (calculées ou non) peuvent servir de dimension/slicer. Les mesures sont toujours des agrégats.
📝 Livrable
Sauvegardez votre fichier sous DAX_Basics_NomGroupe.pbix et déposez-le dans /travaux/.