Support Formation DAX

Corrigés des exercices DAX

Ce document rassemble, pour les 8 thèmes d'exercices DAX, l'énoncé de chaque question, le résultat attendu, la formule DAX de la réponse et une courte explication.

Mode d'emploi

  • Chaque thème correspond à deux PBIP dans dax/exercices/ : ExoN_Theme_Enonce (pour les stagiaires) et ExoN_Theme_Corrige (mesures solutions rangées par dossier dans la table Ventes).
  • Les résultats attendus sont calculés sur le jeu de données des exercices (2024 et 2025) : ils permettent de vérifier rapidement la mesure d'un stagiaire sur une ligne témoin.
  • Les « mesures fournies » existent déjà dans le PBIP énoncé (dossier 0. Mesures fournies).
  • Les formules sont celles du PBIP corrigé ; seule la mise en page (retours à la ligne) a été ajoutée ici.
  • Source (support de formation gd.solutions)

Sommaire

  • Thème 1 | Mesures de base et ratios (6 questions)
  • Thème 2 | Comparaisons dans le temps (6 questions)
  • Thème 3 | Parts et contributions (5 questions)
  • Thème 4 | Classements et Top N (6 questions)
  • Thème 5 | Analyse clients (6 questions)
  • Thème 6 | Objectifs et budget (4 questions)
  • Thème 7 | Délais et logistique (4 questions)
  • Thème 8 | Textes et titres dynamiques (4 questions)

Jeu de données

  • Ventes : 1582 lignes, 784 commandes sur 2024 et 2025 (date de commande, date de livraison, client, produit, pays, quantité, taux de remise, montant remisé).
  • Produit : produit, couleur, catégorie, prix unitaire catalogue, coût unitaire.
  • Client : client, segment (Particulier, Entreprise), pays, ville, date d'inscription.
  • Geographie : pays et continent.
  • Calendrier : table de dates marquée (année, trimestre, mois). Relation active sur Ventes[Date], inactive sur Ventes[DateLivraison].
  • Objectifs : objectif mensuel par pays (daté du 1er du mois), sans relation avec le modèle.

Thème 1 | Mesures de base et ratios

  • Fichiers : Exo1_MesuresBase_Enonce et Exo1_MesuresBase_Corrige.
  • Mesures fournies : aucune, les stagiaires partent de zéro.

Question 1.1 | CA, quantité et commandes

Énoncé

  • Créez trois mesures : le chiffre d'affaires (somme des montants), la quantité vendue et le nombre de commandes.
  • Attention : une commande peut contenir plusieurs lignes.
  • Indice donné aux stagiaires : SUM pour les deux premières, DISTINCTCOUNT sur le numéro de commande pour la troisième.

Résultat attendu

  • Total : CA 1 073 897,36, quantité 3 909, 784 commandes.
  • Ligne Vélos : CA 730 882,13, 341 commandes.

Réponse

CA = SUM ( Ventes[Montant] )

Quantité vendue = SUM ( Ventes[Quantite] )

Nb commandes = DISTINCTCOUNT ( Ventes[NumCommande] )

Explication

  • COUNTROWS ( Ventes ) compterait les lignes, pas les commandes : DISTINCTCOUNT compte les numéros distincts.
  • Sur la ligne Vélos, une commande qui contient deux vélos n'est comptée qu'une fois.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 1.2 | Panier moyen

Énoncé

  • Calculez le panier moyen : chiffre d'affaires moyen par commande.
  • Indice donné aux stagiaires : réutilisez vos mesures CA et Nb commandes, et divisez avec DIVIDE.

Résultat attendu

  • Total : 1 369,77.
  • France : 1 378,31.

Réponse

Panier moyen = DIVIDE ( [CA], [Nb commandes] )

Explication

  • DIVIDE renvoie vide au lieu d'une erreur quand le dénominateur est nul.
  • Réutiliser des mesures existantes garantit la cohérence des chiffres.
  • Source (Microsoft Learn)

Question 1.3 | Prix moyen pondéré

Énoncé

  • Calculez le prix moyen de vente pondéré par les quantités (chiffre d'affaires divisé par la quantité).
  • Indice donné aux stagiaires : ne faites pas la moyenne de la colonne PrixUnitaire : un vélo vendu 10 fois doit compter 10 fois.

Résultat attendu

  • Total : 274,72.
  • Vêtements : 50,01.

Réponse

Prix moyen pondéré = DIVIDE ( [CA], [Quantité vendue] )

Explication

  • AVERAGE ( Produit[PrixUnitaire] ) donnerait la moyenne du catalogue, sans tenir compte des ventes.
  • Le prix obtenu intègre aussi les remises, car le montant est remisé.
  • Source (Microsoft Learn) | Source (SQLBI)

Question 1.4 | Marge et taux de marge

Énoncé

  • Calculez le coût des ventes (quantité x coût unitaire du produit), la marge et le taux de marge.
  • Indice donné aux stagiaires : le coût unitaire est dans la table Produit : il faut un itérateur sur Ventes et RELATED.

Résultat attendu

  • Total : marge 407 386,33, taux 37,94 %.
  • Vélos : taux de marge 37,01 %.

Réponse

Coût = SUMX ( Ventes, Ventes[Quantite] * RELATED ( Produit[CoutUnitaire] ) )

Marge = [CA] - [Coût]

Taux de marge = DIVIDE ( [Marge], [CA] )

Explication

  • SUMX calcule quantité x coût sur chaque ligne de vente ; RELATED lit le coût du produit lié.
  • Le taux de marge se calcule sur les totaux, jamais en additionnant des taux.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 1.5 | Clients et CA par client

Énoncé

  • Comptez les clients distincts qui ont acheté, puis calculez le CA moyen par client.
  • Indice donné aux stagiaires : DISTINCTCOUNT sur la colonne ClientID de Ventes (et non COUNTROWS de la table Client).

Résultat attendu

  • Total : 130 clients, 8 260,75 par client.
  • Entreprise : 26 clients, 16 840,58 par client.

Réponse

Nb clients = DISTINCTCOUNT ( Ventes[ClientID] )

CA moyen par client = DIVIDE ( [CA], [Nb clients] )

Explication

  • Compter dans Ventes donne les clients actifs ; compter la table Client donnerait tous les clients.
  • Les segments Pays et Année montrent que le nombre de clients n'est pas additif.
  • Source (Microsoft Learn)

Question 1.6 | Taux de remise moyen

Énoncé

  • Calculez le CA brut (quantité x prix catalogue) puis le taux de remise moyen : part du CA brut abandonnée en remises.
  • Indice donné aux stagiaires : Taux = ( CA brut - CA ) / CA brut. Le prix catalogue est dans Produit.

Résultat attendu

  • Total : 3,25 %.
  • France : 2,88 %.

Réponse

CA brut = SUMX ( Ventes, Ventes[Quantite] * RELATED ( Produit[PrixUnitaire] ) )

Taux de remise moyen = DIVIDE ( [CA brut] - [CA], [CA brut] )

Explication

  • La moyenne de la colonne TauxRemise ne tiendrait pas compte du poids de chaque vente.
  • Écrire 1 - DIVIDE ( [CA], [CA brut] ) afficherait 100 % sur les lignes sans vente.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Thème 2 | Comparaisons dans le temps

  • Fichiers : Exo2_Temps_Enonce et Exo2_Temps_Corrige.
  • Mesures fournies :
    • CA = SUM ( Ventes[Montant] )

Question 2.1 | CA N-1 et évolution

Énoncé

  • Calculez le CA de l'année précédente pour la même période, puis le pourcentage d'évolution.
  • Indice donné aux stagiaires : SAMEPERIODLASTYEAR dans CALCULATE ; DIVIDE pour le pourcentage.

Résultat attendu

  • Ligne 2025 : CA N-1 528 326,80, évolution 3,26 %.
  • Mars 2025 : CA N-1 37 238,29.

Réponse

CA N-1 = CALCULATE ( [CA], SAMEPERIODLASTYEAR ( Calendrier[Date] ) )

% évolution N-1 = DIVIDE ( [CA] - [CA N-1], [CA N-1] )

Explication

  • SAMEPERIODLASTYEAR décale d'un an les dates visibles : mois, trimestre ou année.
  • En 2024, CA N-1 est vide (pas de données 2023) et DIVIDE renvoie vide.
  • Source (Microsoft Learn) | Source (SQLBI)

Question 2.2 | Cumul annuel

Énoncé

  • Calculez le cumul depuis le 1er janvier (YTD), puis le cumul de l'année précédente à la même date.
  • Indice donné aux stagiaires : TOTALYTD pour le cumul ; pour N-1, appliquez SAMEPERIODLASTYEAR à votre mesure de cumul.

Résultat attendu

  • Juin 2025 : cumul 282 555,63, cumul N-1 274 821,22.

Réponse

Cumul annuel = TOTALYTD ( [CA], Calendrier[Date] )

Cumul annuel N-1 = CALCULATE ( [Cumul annuel], SAMEPERIODLASTYEAR ( Calendrier[Date] ) )

Explication

  • TOTALYTD évalue le CA du 1er janvier à la dernière date visible.
  • Une mesure peut en réutiliser une autre dans CALCULATE : le décalage s'applique au cumul.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 2.3 | Mois précédent

Énoncé

  • Calculez le CA du mois précédent, puis l'écart avec le mois en cours (vide s'il n'y a pas de mois précédent).
  • Indice donné aux stagiaires : DATEADD avec -1 et MONTH ; testez ISBLANK pour l'écart.

Résultat attendu

  • Mars 2025 : CA M-1 39 953,41, écart 2 303,09.
  • Janvier 2024 : CA M-1 et écart vides.

Réponse

CA M-1 = CALCULATE ( [CA], DATEADD ( Calendrier[Date], -1, MONTH ) )

Écart M-1 = IF ( NOT ISBLANK ( [CA M-1] ), [CA] - [CA M-1] )

Explication

  • DATEADD décale chaque date visible d'un mois.
  • Sans le test ISBLANK, janvier 2024 afficherait un écart égal au CA.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 2.4 | Moyenne mobile 3 mois

Énoncé

  • Calculez la moyenne mobile sur 3 mois : CA des 3 derniers mois (mois en cours inclus) divisé par 3.
  • Indice donné aux stagiaires : DATESINPERIOD à partir de MAX ( Calendrier[Date] ), sur -3 mois.

Résultat attendu

  • Mars 2025 : 42 737,24.
  • Janvier 2025 (inclut novembre et décembre 2024) : 40 788,55.

Réponse

Moyenne mobile 3 mois =
DIVIDE ( CALCULATE ( [CA], DATESINPERIOD ( Calendrier[Date], MAX ( Calendrier[Date] ), -3, MONTH ) ), 3 )

Explication

  • La période glissante traverse les années : janvier reprend novembre et décembre précédents.
  • Sur la ligne d'une année, la valeur correspond aux 3 derniers mois de l'année.
  • Source (Microsoft Learn) | Source (SQLBI)

Question 2.5 | 12 mois glissants

Énoncé

  • Calculez le CA des 12 derniers mois glissants à la fin de chaque mois.
  • Indice donné aux stagiaires : même principe que la moyenne mobile, avec -12 mois.

Résultat attendu

  • Juin 2025 : 536 061,21 (juillet 2024 à juin 2025).
  • Ligne 2025 : 545 570,56.

Réponse

CA 12 mois glissants =
CALCULATE ( [CA], DATESINPERIOD ( Calendrier[Date], MAX ( Calendrier[Date] ), -12, MONTH ) )

Explication

  • Cet indicateur lisse la saisonnalité : chaque point couvre une année complète.
  • Avant décembre 2024, la période est incomplète (pas de données 2023).
  • Source (Microsoft Learn)

Question 2.6 | Meilleur mois

Énoncé

  • Pour chaque année, affichez le nom du meilleur mois et son CA.
  • Indice donné aux stagiaires : MAXX sur VALUES ( Calendrier[Mois] ) pour le montant ; TOPN ( 1, ... ) pour retrouver le nom.

Résultat attendu

  • 2025 : juillet, 81 752,10.
  • 2024 : juin, 59 290,67.

Réponse

CA du meilleur mois = MAXX ( VALUES ( Calendrier[Mois] ), [CA] )

Meilleur mois = MAXX ( TOPN ( 1, VALUES ( Calendrier[Mois] ), [CA] ), Calendrier[Mois] )

Explication

  • MAXX évalue [CA] pour chaque mois visible (transition de contexte) et garde le plus grand.
  • TOPN ( 1, ... ) renvoie la ligne du meilleur mois ; MAXX en extrait le nom.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Thème 3 | Parts et contributions

  • Fichiers : Exo3_Parts_Enonce et Exo3_Parts_Corrige.
  • Mesures fournies :
    • CA = SUM ( Ventes[Montant] )

Question 3.1 | Part du total général

Énoncé

  • Calculez la part de chaque produit dans le CA total, tous produits confondus, même si un segment de catégorie est utilisé.
  • Indice donné aux stagiaires : le dénominateur ignore les filtres sur la table Produit : ALL ( Produit ).

Résultat attendu

  • Vélo route rouge : 6,78 %.
  • Ligne Vélos : 68,06 %.

Réponse

% du total général = DIVIDE ( [CA], CALCULATE ( [CA], ALL ( Produit ) ) )

Explication

  • ALL ( Produit ) supprime tous les filtres de la table Produit, y compris le segment Catégorie.
  • Le filtre Pays (autre table) est conservé : la part est calculée dans le pays choisi.
  • Source (Microsoft Learn)

Question 3.2 | Part du total affiché

Énoncé

  • Calculez la part dans le total affiché : le total doit toujours faire 100 %, même avec le segment Catégorie.
  • Indice donné aux stagiaires : ALLSELECTED garde les filtres des segments et retire ceux de la vignette.

Résultat attendu

  • Sans segment : identique à la question 1 (Vélo route rouge : 6,78 %).
  • Segment Catégorie = Vélos : Vélo route rouge 9,96 %.

Réponse

% du total affiché = DIVIDE ( [CA], CALCULATE ( [CA], ALLSELECTED ( Produit ) ) )

Explication

  • ALLSELECTED retire les filtres des lignes de la matrice mais respecte la sélection du segment.
  • Comparez avec ALL : choisissez Vélos dans le segment, seul ALLSELECTED revient à 100 %.
  • Source (Microsoft Learn) | Source (SQLBI)

Question 3.3 | Part dans la catégorie

Énoncé

  • Calculez la part de chaque produit dans sa catégorie.
  • Indice donné aux stagiaires : le dénominateur garde seulement le filtre sur la catégorie : ALLEXCEPT.

Résultat attendu

  • Casque rouge : 8,45 % des Accessoires.
  • Chaque ligne de catégorie : 100 %.

Réponse

% dans la catégorie =
DIVIDE ( [CA], CALCULATE ( [CA], ALLEXCEPT ( Produit, Produit[Categorie] ) ) )

Explication

  • ALLEXCEPT supprime les filtres de Produit, sauf celui sur Categorie.
  • Variante robuste : REMOVEFILTERS ( Produit ), VALUES ( Produit[Categorie] ).
  • Source (Microsoft Learn) | Source (SQLBI)

Question 3.4 | Contribution à la croissance

Énoncé

  • Calculez l'écart de CA 2025 vs 2024, puis la contribution de chaque pays à l'écart total.
  • Indice donné aux stagiaires : Écart = CA 2025 - CA 2024 (filtres sur Calendrier[Annee]). Contribution = écart du pays / écart de tous les pays.

Résultat attendu

  • Écart total : 17 243,76.
  • France : écart 22 745,07, contribution 131,90 %.

Réponse

Écart 2025 vs 2024 =
CALCULATE ( [CA], Calendrier[Annee] = 2025 ) - CALCULATE ( [CA], Calendrier[Annee] = 2024 )

Contribution à la croissance =
DIVIDE ( [Écart 2025 vs 2024], CALCULATE ( [Écart 2025 vs 2024], ALL ( Geographie ) ) )

Explication

  • Une contribution peut dépasser 100 % ou être négative : certains pays reculent pendant que d'autres progressent.
  • La somme des contributions vaut toujours 100 %.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 3.5 | Pareto 80/20

Énoncé

  • Calculez le CA cumulé des produits triés du plus vendu au moins vendu, son pourcentage, puis une classe : A jusqu'à 80 %, B au-delà.
  • Indice donné aux stagiaires : pour un produit, additionnez le CA de tous les produits qui ont un CA supérieur ou égal (ADDCOLUMNS, FILTER, SUMX).

Résultat attendu

  • Produit n° 1 (Vélo ville jaune) : 20,42 % cumulé.
  • 8 produits sur 24 sont en classe A.

Réponse

CA cumulé Pareto =
VAR ca = [CA]
RETURN
    SUMX ( FILTER ( ADDCOLUMNS ( ALLSELECTED ( Produit[Produit] ), "@CA", [CA] ), [@CA] >= ca ), [@CA] )

% cumulé Pareto = DIVIDE ( [CA cumulé Pareto], CALCULATE ( [CA], ALLSELECTED ( Produit ) ) )

Classe Pareto =
IF ( HASONEVALUE ( Produit[Produit] ), IF ( [% cumulé Pareto] <= 0.8, "A", "B" ) )

Explication

  • ADDCOLUMNS calcule le CA de chaque produit ; FILTER garde ceux qui font au moins autant que le produit en cours.
  • Triez la matrice par CA décroissant pour lire la courbe de Pareto.
  • Source (Microsoft Learn) | Source (SQLBI)

Thème 4 | Classements et Top N

  • Fichiers : Exo4_Classements_Enonce et Exo4_Classements_Corrige.
  • Mesures fournies :
    • CA = SUM ( Ventes[Montant] )
  • Table fournie : ParamTopN (GENERATESERIES de 1 à 10, paramètre du Top N).
  • Table fournie : ProduitsAutres (liste des produits plus une ligne « Autres », sans relation).

Question 4.1 | Rang des produits

Énoncé

  • Calculez le rang de chaque produit selon son CA (1 = meilleur). Le total ne doit pas afficher de rang.
  • Indice donné aux stagiaires : RANKX sur ALL ( Produit[Produit] ) ; HASONEVALUE pour masquer le total.

Résultat attendu

  • Rang 1 : Vélo ville jaune ; rang 2 : Vélo ville bleu.
  • Casque rouge : rang 24.

Réponse

Rang produit =
IF ( HASONEVALUE ( Produit[Produit] ), RANKX ( ALL ( Produit[Produit] ), [CA] ) )

Explication

  • RANKX évalue [CA] pour chaque produit de la table ALL, puis situe le produit en cours.
  • Sans ALL, chaque ligne ne verrait qu'un produit et aurait le rang 1.
  • Source (Microsoft Learn) | Source (SQLBI)

Question 4.2 | Rang dans la catégorie

Énoncé

  • Calculez le rang de chaque produit à l'intérieur de sa catégorie.
  • Indice donné aux stagiaires : la table de RANKX doit contenir les produits de la même catégorie : CALCULATETABLE avec ALLEXCEPT.

Résultat attendu

  • Accessoires : 1er Sacoche, 2e Casque blanc.

Réponse

Rang dans la catégorie =
IF ( HASONEVALUE ( Produit[Produit] ), RANKX ( CALCULATETABLE ( VALUES ( Produit[Produit] ), ALLEXCEPT ( Produit, Produit[Categorie] ) ), [CA] ) )

Explication

  • CALCULATETABLE renvoie les produits de la catégorie en cours, quel que soit le produit de la ligne.
  • Le rang repart à 1 dans chaque catégorie.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 4.3 | CA des 3 meilleurs produits

Énoncé

  • Pour chaque pays, calculez le CA réalisé par ses 3 meilleurs produits.
  • Indice donné aux stagiaires : TOPN ( 3, VALUES ( Produit[Produit] ), [CA] ) renvoie une table : itérez dessus avec SUMX.

Résultat attendu

  • France : 145 881,07.
  • Total : 506 905,80.

Réponse

CA top 3 produits = SUMX ( TOPN ( 3, VALUES ( Produit[Produit] ), [CA] ), [CA] )

Explication

  • Les 3 meilleurs produits sont recalculés dans chaque pays.
  • Le total n'est pas la somme des lignes : c'est le top 3 tous pays confondus.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 4.4 | Top N dynamique

Énoncé

  • La table ParamTopN (1 à 10) est fournie. Affichez le CA seulement pour les N meilleurs produits, N étant choisi dans le segment (5 par défaut).
  • Indice donné aux stagiaires : SELECTEDVALUE ( ParamTopN[Value], 5 ) pour lire N ; RANKX sur ALLSELECTED pour le rang.

Résultat attendu

  • N = 5 : Vélo ville jaune, Vélo ville bleu, Vélo route noir, VTT noir, Vélo route rouge.
  • Les autres produits disparaissent de la matrice (valeur vide).

Réponse

N choisi = SELECTEDVALUE ( ParamTopN[Value], 5 )

CA Top N =
IF ( HASONEVALUE ( Produit[Produit] ), IF ( RANKX ( ALLSELECTED ( Produit[Produit] ), [CA] ) <= [N choisi], [CA] ) )

Explication

  • Une mesure vide fait disparaître la ligne : seule la mesure CA Top N doit être dans le visuel.
  • ParamTopN est un paramètre de simulation (Modélisation, Nouveau paramètre).
  • Source (Microsoft Learn) | Source (SQLBI)

Question 4.5 | Meilleur produit par pays

Énoncé

  • Affichez le nom du meilleur produit de chaque pays.
  • Indice donné aux stagiaires : TOPN ( 1, ... ) renvoie une ligne ; MAXX permet d'en lire le nom.

Résultat attendu

  • France : Vélo ville jaune.
  • Total : Vélo ville jaune.

Réponse

Meilleur produit = MAXX ( TOPN ( 1, VALUES ( Produit[Produit] ), [CA] ), Produit[Produit] )

Explication

  • En cas d'égalité, TOPN renvoie plusieurs lignes : MAXX garde alors le dernier nom par ordre alphabétique.
  • Même technique pour le meilleur client, le meilleur mois...
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 4.6 | Top 5 et Autres

Énoncé

  • La table ProduitsAutres (produits + une ligne « Autres ») est fournie. Affichez le CA des 5 meilleurs produits, et le reste regroupé sur la ligne Autres.
  • Indice donné aux stagiaires : lisez la ligne avec SELECTEDVALUE ; calculez le top 5 avec TOPN ; EXCEPT donne les produits hors top 5.

Résultat attendu

  • Autres : 408 795,45.
  • Total : 1 073 897,36.

Réponse

CA Top 5 et Autres =
VAR p = SELECTEDVALUE ( ProduitsAutres[Produit] )
VAR top5 = TOPN ( 5, ALL ( Produit[Produit] ), [CA] )
RETURN
    SWITCH ( TRUE (), NOT HASONEVALUE ( ProduitsAutres[Produit] ), [CA], p = "Autres", CALCULATE ( [CA], EXCEPT ( ALL ( Produit[Produit] ), top5 ) ), p IN top5, CALCULATE ( [CA], Produit[Produit] = p ) )

Explication

  • La table ProduitsAutres n'est reliée à rien : la mesure traduit chaque ligne en filtre sur Produit.
  • Les produits hors top 5 renvoient vide et disparaissent ; triez la matrice par la mesure.
  • Source (SQLBI) | Source (Microsoft Learn)

Thème 5 | Analyse clients

  • Fichiers : Exo5_Clients_Enonce et Exo5_Clients_Corrige.
  • Mesures fournies :
    • CA = SUM ( Ventes[Montant] )
    • Nb commandes = DISTINCTCOUNT ( Ventes[NumCommande] )

Question 5.1 | Clients actifs

Énoncé

  • Comptez les clients actifs : clients ayant passé au moins une commande sur la période.
  • Indice donné aux stagiaires : DISTINCTCOUNT sur Ventes[ClientID].

Résultat attendu

  • 2025 : 111 clients ; mars 2025 : 29.
  • Total : 130.

Réponse

Clients actifs = DISTINCTCOUNT ( Ventes[ClientID] )

Explication

  • Le total n'est pas la somme des mois : un même client peut acheter plusieurs mois.
  • La table Client contient aussi des clients sans achat sur la période.
  • Source (Microsoft Learn)

Question 5.2 | Nouveaux clients

Énoncé

  • Comptez les nouveaux clients : clients dont la toute première commande a lieu dans la période affichée.
  • Indice donné aux stagiaires : pour chaque client actif (VALUES), calculez sa première date d'achat en ignorant le calendrier (ALL), puis comparez au début de la période.

Résultat attendu

  • 2025 : 23 ; mars 2025 : 1.
  • 2024 : tous les clients actifs sont nouveaux (pas de données avant).

Réponse

Nouveaux clients =
VAR debut = MIN ( Calendrier[Date] )
RETURN
    COUNTROWS ( FILTER ( VALUES ( Ventes[ClientID] ), CALCULATE ( MIN ( Ventes[Date] ), ALL ( Calendrier ) ) >= debut ) )

Explication

  • CALCULATE déclenche la transition de contexte : le client de la ligne devient un filtre.
  • ALL ( Calendrier ) retire le filtre de période pour retrouver la première commande de toute l'histoire.
  • Source (SQLBI) | Source (Microsoft Learn)

Question 5.3 | Clients perdus

Énoncé

  • Comptez les clients perdus : clients ayant acheté l'année précédente mais aucune fois dans la période.
  • Indice donné aux stagiaires : liste des clients de N-1 (CALCULATETABLE + DATEADD), moins la liste des clients actuels (EXCEPT).

Résultat attendu

  • 2025 : 19 clients perdus.
  • 2024 : vide (pas de données 2023).

Réponse

Clients perdus =
VAR avant = CALCULATETABLE ( VALUES ( Ventes[ClientID] ), DATEADD ( Calendrier[Date], -1, YEAR ) )
RETURN
    COUNTROWS ( EXCEPT ( avant, VALUES ( Ventes[ClientID] ) ) )

Explication

  • EXCEPT renvoie les lignes de la 1re table absentes de la 2nde.
  • Au niveau mois, la définition devient « client du même mois l'an dernier » : préférez l'année.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 5.4 | Fréquence d'achat

Énoncé

  • Calculez la fréquence d'achat : nombre moyen de commandes par client actif.
  • Indice donné aux stagiaires : Nb commandes divisé par le nombre de clients distincts.

Résultat attendu

  • Total : 6,03.
  • Entreprise : 11,42.

Réponse

Fréquence d'achat = DIVIDE ( [Nb commandes], DISTINCTCOUNT ( Ventes[ClientID] ) )

Explication

  • Les clients Entreprise commandent plus souvent que les particuliers.
  • Filtrez une année : la fréquence porte alors sur cette seule année.
  • Source (Microsoft Learn)

Question 5.5 | Dernière commande

Énoncé

  • Affichez la date de la dernière commande de chaque client, et le nombre de jours écoulés jusqu'au 31/12/2025.
  • Indice donné aux stagiaires : MAX ( Ventes[Date] ) ; DATEDIFF en jours avec DATE ( 2025, 12, 31 ).

Résultat attendu

  • Alice Bernard : 24/10/2024, soit 433 jours.

Réponse

Dernière commande = MAX ( Ventes[Date] )

Jours depuis la dernière commande =
IF ( NOT ISBLANK ( [Dernière commande] ), DATEDIFF ( [Dernière commande], DATE ( 2025, 12, 31 ), DAY ) )

Explication

  • Une date fixe rend l'exercice reproductible ; en production, utilisez TODAY ().
  • Triez par nombre de jours décroissant pour repérer les clients à relancer.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 5.6 | Segmentation des clients

Énoncé

  • Classez chaque client : Or à partir de 12 000 de CA, Argent à partir de 5 000, Bronze en dessous. Comptez aussi les clients Or.
  • Indice donné aux stagiaires : SWITCH ( TRUE (), ... ) pour la classe ; FILTER sur VALUES ( Ventes[ClientID] ) pour compter.

Résultat attendu

  • 30 clients Or, 55 Argent, 45 Bronze (toutes années).

Réponse

Classe client =
VAR ca = [CA]
RETURN
    IF ( HASONEVALUE ( Client[Client] ), SWITCH ( TRUE (), ISBLANK ( ca ), BLANK (), ca >= 12000, "Or", ca >= 5000, "Argent", "Bronze" ) )

Nb clients Or = COUNTROWS ( FILTER ( VALUES ( Ventes[ClientID] ), [CA] >= 12000 ) )

Explication

  • SWITCH ( TRUE (), ... ) teste les conditions dans l'ordre : la première vraie l'emporte.
  • Choisissez une année : la classe change, car elle dépend du CA de la période.
  • Source (Microsoft Learn) | Source (SQLBI)

Thème 6 | Objectifs et budget

  • Fichiers : Exo6_Objectifs_Enonce et Exo6_Objectifs_Corrige.
  • Mesures fournies :
    • CA = SUM ( Ventes[Montant] )

Question 6.1 | Objectif par TREATAS

Énoncé

  • La table Objectifs (Pays, Date du 1er du mois, Objectif) n'est reliée à rien. Créez la mesure Objectif période qui suit les filtres Pays et dates.
  • Indice donné aux stagiaires : deux TREATAS dans CALCULATE : les pays visibles vers Objectifs[Pays], les dates visibles vers Objectifs[Date].

Résultat attendu

  • France 2025 : 152 500,00.
  • Total 2024 et 2025 : 1 138 700,00.

Réponse

Objectif période =
CALCULATE ( SUM ( Objectifs[Objectif] ), TREATAS ( VALUES ( Geographie[Pays] ), Objectifs[Pays] ), TREATAS ( VALUES ( Calendrier[Date] ), Objectifs[Date] ) )

Explication

  • TREATAS applique les valeurs d'une colonne comme filtre sur une autre, comme une relation virtuelle.
  • Les objectifs sont datés du 1er du mois : un mois ou une année visible contient bien cette date.
  • Source (Microsoft Learn) | Source (SQLBI)

Question 6.2 | Écart et taux d'atteinte

Énoncé

  • Calculez l'écart à l'objectif (CA - objectif) et le taux d'atteinte (CA / objectif).
  • Indice donné aux stagiaires : réutilisez la mesure Objectif période de la question 1.

Résultat attendu

  • France 2025 : écart -3 296,32, taux 97,84 %.

Réponse

Écart à l'objectif = [CA] - [Objectif période]

Taux d'atteinte = DIVIDE ( [CA], [Objectif période] )

Explication

  • Un écart négatif signale un retard sur l'objectif.
  • Le taux d'atteinte se lit mieux avec une mise en forme conditionnelle (question 4).
  • Source (Microsoft Learn)

Question 6.3 | Objectif cumulé

Énoncé

  • Calculez le CA cumulé et l'objectif cumulé depuis le début de l'année.
  • Indice donné aux stagiaires : TOTALYTD pour le CA ; CALCULATE ( [Objectif période], DATESYTD ( ... ) ) pour l'objectif.

Résultat attendu

  • Juin 2025, tous pays : CA cumulé 282 555,63, objectif cumulé 315 600,00.

Réponse

CA cumulé = TOTALYTD ( [CA], Calendrier[Date] )

Objectif cumulé = CALCULATE ( [Objectif période], DATESYTD ( Calendrier[Date] ) )

Explication

  • DATESYTD modifie les dates visibles ; TREATAS les transmet ensuite à la table Objectifs.
  • C'est l'intérêt de réutiliser une mesure : la logique TREATAS n'est écrite qu'une fois.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 6.4 | Statut avec icône

Énoncé

  • Affichez un statut : « Atteint » à partir de 100 %, « Proche » à partir de 95 %, « En retard » sinon, précédé d'un rond (UNICHAR ( 9679 )), et une mesure Couleur statut (vert, orange, rouge) pour colorer le texte.
  • Indice donné aux stagiaires : SWITCH ( TRUE (), ... ) sur le taux d'atteinte ; la couleur s'applique par Mise en forme conditionnelle, Couleur de police, Valeur de champ.

Résultat attendu

  • 2025 : Allemagne Atteint, Belgique Atteint, Canada En retard, États-Unis Proche, France Proche, Royaume-Uni En retard.

Réponse

Statut objectif =
VAR t = [Taux d'atteinte]
RETURN
    SWITCH ( TRUE (), ISBLANK ( t ), BLANK (), t >= 1, UNICHAR ( 9679 ) & " Atteint", t >= 0.95, UNICHAR ( 9679 ) & " Proche", UNICHAR ( 9679 ) & " En retard" )

Couleur statut =
VAR t = [Taux d'atteinte]
RETURN
    SWITCH ( TRUE (), ISBLANK ( t ), BLANK (), t >= 1, "#1E8E3E", t >= 0.95, "#F29900", "#D93025" )

Explication

  • La couleur de police de Statut objectif est pilotée par la mesure Couleur statut (fx, Valeur de champ).
  • Les mesures de la question 2 sont reprises ici pour que la page fonctionne seule.
  • Source (Microsoft Learn) | Source (Microsoft Learn, mise en forme)

Thème 7 | Délais et logistique

  • Fichiers : Exo7_Delais_Enonce et Exo7_Delais_Corrige.
  • Mesures fournies :
    • CA = SUM ( Ventes[Montant] )
    • Nb commandes = DISTINCTCOUNT ( Ventes[NumCommande] )

Question 7.1 | Délai moyen de livraison

Énoncé

  • Calculez le délai moyen de livraison en jours (date de livraison - date de commande), ligne par ligne.
  • Indice donné aux stagiaires : AVERAGEX sur Ventes avec DATEDIFF ( ..., DAY ).

Résultat attendu

  • Total : 4,9 jours.
  • France : 5,1 jours.

Réponse

Délai moyen (jours) =
AVERAGEX ( Ventes, DATEDIFF ( Ventes[Date], Ventes[DateLivraison], DAY ) )

Explication

  • AVERAGEX calcule le délai de chaque ligne, puis en fait la moyenne.
  • Une colonne calculée « Délai » ferait aussi l'affaire, au prix d'un peu de mémoire.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 7.2 | Commandes livrées en 5 jours

Énoncé

  • Calculez le pourcentage de commandes livrées en 5 jours ou moins. Raisonnez par commande, pas par ligne.
  • Indice donné aux stagiaires : FILTER sur VALUES ( Ventes[NumCommande] ) ; pour chaque commande, CALCULATE ( DATEDIFF ( MAX (...), MAX (...), DAY ) ).

Résultat attendu

  • Total : 64,67 %.
  • France : 66,50 %.

Réponse

% livrées en 5 jours =
DIVIDE ( COUNTROWS ( FILTER ( VALUES ( Ventes[NumCommande] ), CALCULATE ( DATEDIFF ( MAX ( Ventes[Date] ), MAX ( Ventes[DateLivraison] ), DAY ) ) <= 5 ) ), [Nb commandes] )

Explication

  • CALCULATE déclenche la transition de contexte : MAX lit les dates de la commande en cours.
  • Compter les lignes donnerait plus de poids aux grosses commandes.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 7.3 | CA par date de livraison

Énoncé

  • Le calendrier est relié à Ventes[Date] (active) et à Ventes[DateLivraison] (inactive). Calculez le CA par date de livraison.
  • Indice donné aux stagiaires : USERELATIONSHIP dans CALCULATE active la relation inactive.

Résultat attendu

  • Janvier 2025 : par commande 46 001,82, par livraison 45 442,90.

Réponse

CA par date de livraison =
CALCULATE ( [CA], USERELATIONSHIP ( Ventes[DateLivraison], Calendrier[Date] ) )

Explication

  • Les commandes de fin de mois sont livrées le mois suivant : le CA glisse d'un mois à l'autre.
  • Le total reste identique : seules les dates changent.
  • Source (Microsoft Learn)

Question 7.4 | Commandes en retard

Énoncé

  • Comptez les commandes livrées en plus de 7 jours.
  • Indice donné aux stagiaires : même structure que la question 2, avec la condition > 7 et COUNTROWS.

Résultat attendu

  • Total : 120 commandes.
  • France : 36 commandes.

Réponse

Commandes en retard =
COUNTROWS ( FILTER ( VALUES ( Ventes[NumCommande] ), CALCULATE ( DATEDIFF ( MAX ( Ventes[Date] ), MAX ( Ventes[DateLivraison] ), DAY ) ) > 7 ) )

Explication

  • COUNTROWS d'une table vide renvoie vide : ajoutez + 0 pour afficher 0.
  • Réutilisable pour tout seuil : délai, montant, quantité.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Thème 8 | Textes et titres dynamiques

  • Fichiers : Exo8_Textes_Enonce et Exo8_Textes_Corrige.
  • Mesures fournies :
    • CA = SUM ( Ventes[Montant] )

Question 8.1 | Titre dynamique

Énoncé

  • Créez un titre du type « CA France | 2025 », qui reprend le pays et l'année sélectionnés, ou « tous pays » et « 2024 et 2025 » sans sélection. Liez-le au titre du visuel (fx).
  • Indice donné aux stagiaires : SELECTEDVALUE pour le pays ; HASONEVALUE et FORMAT pour l'année (numérique).

Résultat attendu

  • Sans sélection : « CA tous pays | 2024 et 2025 ».
  • France et 2025 : « CA France | 2025 ».

Réponse

Titre du rapport =
"CA " & SELECTEDVALUE ( Geographie[Pays], "tous pays" ) & " | " & IF ( HASONEVALUE ( Calendrier[Annee] ), FORMAT ( VALUES ( Calendrier[Annee] ), "0" ), "2024 et 2025" )

Explication

  • Titre du visuel : Mise en forme, Titre, bouton fx, Valeur de champ, mesure Titre du rapport.
  • FORMAT convertit l'année en texte et évite un mélange de types.
  • Source (Microsoft Learn) | Source (Microsoft Learn, titres)

Question 8.2 | Liste des catégories

Énoncé

  • Affichez la liste des catégories visibles, séparées par des virgules et triées par ordre alphabétique.
  • Indice donné aux stagiaires : CONCATENATEX sur VALUES ( Produit[Categorie] ).

Résultat attendu

  • Sans sélection : « Accessoires, Composants, Vélos, Vêtements ».
  • Ligne Vélos de la matrice : « Vélos ».

Réponse

Catégories sélectionnées =
CONCATENATEX ( VALUES ( Produit[Categorie] ), Produit[Categorie], ", ", Produit[Categorie], ASC )

Explication

  • Les 4e et 5e arguments de CONCATENATEX fixent l'ordre de tri.
  • Au-delà de quelques valeurs, affichez plutôt leur nombre (COUNTROWS).
  • Source (Microsoft Learn)

Question 8.3 | Libellé du meilleur produit

Énoncé

  • Créez un libellé du type « Meilleur produit : VTT noir (12 345 €) ».
  • Indice donné aux stagiaires : trouvez le nom avec TOPN et MAXX dans une variable, puis FORMAT pour le montant.

Résultat attendu

  • Total : meilleur produit Vélo ville jaune (219 290 €).
  • France : Vélo ville jaune (64 583 €).

Réponse

Libellé meilleur produit =
VAR p = MAXX ( TOPN ( 1, VALUES ( Produit[Produit] ), [CA] ), Produit[Produit] )
RETURN
    "Meilleur produit : " & p & " (" & FORMAT ( CALCULATE ( [CA], Produit[Produit] = p ), "#,##0 €" ) & ")"

Explication

  • La variable p évite de recalculer le meilleur produit deux fois.
  • FORMAT renvoie du texte : à réserver aux libellés, jamais aux valeurs à additionner.
  • Source (Microsoft Learn) | Source (Microsoft Learn)

Question 8.4 | Message sans donnée

Énoncé

  • Affichez le CA mis en forme, ou le message « Aucune vente pour cette sélection » quand il n'y a pas de vente.
  • Indice donné aux stagiaires : IF ( ISBLANK ( [CA] ), ... ) ; utilisez la mesure dans une carte.

Résultat attendu

  • Pays = Allemagne, année = 2025, ligne Casquette : « Aucune vente pour cette sélection ».

Réponse

CA ou message =
IF ( ISBLANK ( [CA] ), "Aucune vente pour cette sélection", FORMAT ( [CA], "#,##0.00 €" ) )

Explication

  • Une carte vide affiche « (Vide) » : le message est plus clair pour l'utilisateur.
  • Dans une matrice, la mesure affiche le message sur chaque produit sans vente, et fait réapparaître ces lignes.
  • Source (Microsoft Learn) | Source (Microsoft Learn)