AccueilBlogDAX avancé Power BI
Guide recrutement data

DAX avancé Power BI : les formules qu'on teste en entretien

CALCULATE, REMOVEFILTERS, VAR, time intelligence — ces formules DAX séparent un vrai Data Analyst d'un utilisateur Power BI basique. Voici ce qu'on évalue vraiment.

Data Builder·Juin 2025·10 min de lecture·Data Analyst

Le DAX est le vrai filtre en entretien Data Analyst Power BI. Pas les visuels, pas Power Query — le DAX. Un candidat qui maîtrise CALCULATE et le contexte de filtre a travaillé sur des projets réels. Un candidat qui ne connaît que SUM et COUNT n'a fait que du drag-and-drop.

1CALCULATE : le cœur du DAX

Question discriminante

Quelle est la différence entre un contexte de ligne et un contexte de filtre ? Dans quel cas CALCULATE transforme-t-il l'un en l'autre ?

CALCULATE est la fonction la plus importante de DAX. Elle permet de modifier le contexte de filtre d'une mesure — c'est-à-dire de calculer un résultat dans un contexte différent de celui du visuel.

-- Ventes uniquement pour la catégorie Technologie Tech_Ventes = CALCULATE( SUM(Ventes[Montant]), Ventes[Categorie] = "Technologie" )
  • Contexte de filtre — ce que Power BI applique automatiquement via les slicers, les lignes de tableau, les visuels
  • Contexte de ligne — ce qui existe dans les colonnes calculées, lors de l'itération ligne par ligne
  • Transition de contexte — CALCULATE transforme le contexte de ligne en contexte de filtre dans les mesures

Signal d'alerte : un candidat qui ne sait pas expliquer la transition de contexte n'a pas encore travaillé sur des modèles complexes.

2Contrôle du contexte : ALL, REMOVEFILTERS, KEEPFILTERS

Question discriminante

Quelle est la différence entre ALL() et REMOVEFILTERS() ? Donnez un cas où l'un est préférable à l'autre.

C'est la question qui sépare les profils confirmés des juniors. Les deux fonctions suppriment des filtres, mais leur comportement diffère dans certains contextes.

-- ALL supprime tous les filtres sur la table ou la colonne Part_de_marche = DIVIDE( [Total Ventes], CALCULATE([Total Ventes], ALL(Produits)) ) -- REMOVEFILTERS est plus explicite et préférable pour la lisibilité Part_de_marche_v2 = DIVIDE( [Total Ventes], CALCULATE([Total Ventes], REMOVEFILTERS(Produits)) ) -- KEEPFILTERS : respecte les filtres du visuel tout en ajoutant des conditions Ventes_Chaussures = CALCULATE( [Total Ventes], KEEPFILTERS(Produits[Categorie] = "Chaussures") )
  • ALL() — supprime tous les filtres, peut casser les filtres visuels dans certains cas
  • REMOVEFILTERS() — plus précis, plus lisible, comportement identique à ALL() dans la plupart des cas
  • KEEPFILTERS() — ajoute un filtre sans supprimer ceux déjà en place
  • ALLEXCEPT() — supprime tous les filtres sauf ceux spécifiés

3VAR/RETURN : lisibilité et performance

Question discriminante

Pourquoi VAR améliore-t-il les performances DAX et pas seulement la lisibilité ?

VAR/RETURN est devenu incontournable en 2024-2025. Un profil qui ne l'utilise pas systématiquement écrit du DAX sous-optimal.

-- Sans VAR : SUM(Ventes[Montant]) est calculé deux fois Croissance_YoY = (SUM(Ventes[Montant]) - CALCULATE(SUM(Ventes[Montant]), DATEADD(Dates[Date], -1, YEAR))) / CALCULATE(SUM(Ventes[Montant]), DATEADD(Dates[Date], -1, YEAR)) -- Avec VAR : calculé une seule fois, plus lisible et plus rapide Croissance_YoY = VAR VentesActuelles = SUM(Ventes[Montant]) VAR VentesPrecedentes = CALCULATE(SUM(Ventes[Montant]), DATEADD(Dates[Date], -1, YEAR)) RETURN DIVIDE(VentesActuelles - VentesPrecedentes, VentesPrecedentes)
  • VAR évalue l'expression une seule fois et stocke le résultat en mémoire
  • Évite les recalculs multiples dans les formules complexes
  • Permet le débogage en retournant VAR intermédiaire directement
  • Rend le DAX lisible comme du pseudocode

Bonne pratique : tout calcul qui réutilise une expression plus d'une fois devrait utiliser VAR. C'est le signal d'un profil qui pense à la maintenabilité.

4Time intelligence : l'incontournable en entretien

Question discriminante

Quelle est la différence entre DATEADD et SAMEPERIODLASTYEAR ? Dans quel cas l'un est-il plus adapté ?

La time intelligence est testée dans presque tous les entretiens Data Analyst. Les recruteurs veulent s'assurer que le candidat peut répondre à des questions business courantes : évolution annuelle, cumul progressif, comparaison de périodes.

-- Ventes de l'année précédente (même période) Ventes_N1 = CALCULATE([Total Ventes], SAMEPERIODLASTYEAR(Dates[Date])) -- Flexible : déplacer de n périodes (mois, trimestres, années) Ventes_3_mois_avant = CALCULATE([Total Ventes], DATEADD(Dates[Date], -3, MONTH)) -- Cumul progressif depuis le début de l'année (YTD) Ventes_YTD = TOTALYTD([Total Ventes], Dates[Date]) -- Cumul depuis le début du mois Ventes_MTD = TOTALMTD([Total Ventes], Dates[Date])
  • SAMEPERIODLASTYEAR — retourne exactement la même période un an avant, utile pour YoY
  • DATEADD — plus flexible, décale de n unités (jours, mois, trimestres, années)
  • TOTALYTD / TOTALMTD / TOTALQTD — cumuls progressifs, nécessitent une table de dates marquée
  • DATESINPERIOD — fenêtre glissante sur N jours/mois

Prérequis indispensable : toutes les fonctions de time intelligence nécessitent une table de dates correctement marquée dans Power BI. Un candidat qui l'ignore n'a pas déployé de rapport en production.

5Fonctions d'itération : SUMX, AVERAGEX, RANKX

Question discriminante

Quand utilisez-vous SUMX plutôt que SUM ? Donnez un exemple concret.

-- SUM : additionne une colonne existante Total_Ventes = SUM(Ventes[Montant]) -- SUMX : itère ligne par ligne avant d'agréger Marge_Totale = SUMX( Produits, Produits[Prix_Vente] * Produits[Quantite] - Produits[Cout] ) -- RANKX : classement dynamique Rang_Commercial = RANKX( ALL(Commerciaux[Nom]), [Total Ventes], , DESC, DENSE ) -- SWITCH(TRUE()) : remplace les IF imbriqués Segment_Client = SWITCH( TRUE(), [Total Ventes] > 50000, "Gold", [Total Ventes] > 10000, "Silver", "Bronze" )
  • SUMX / AVERAGEX — itèrent sur une table, appliquent une expression, puis agrègent
  • RANKX — classement dynamique, très utilisé pour les tops N
  • SWITCH(TRUE()) — alternative lisible aux IF imbriqués
  • SELECTEDVALUE() — capture la valeur d'un slicer, évite les erreurs multi-valeurs

6Performance DAX : ce qu'on teste au niveau Senior

Question discriminante

Comment diagnostiquez-vous une mesure DAX lente ? Quels outils utilisez-vous ?

Au niveau Senior et Lead, la capacité à optimiser le DAX est un différenciateur clé. Un bon profil cite DAX Studio sans hésiter.

  • DAX Studio — analyser le query plan, identifier les cold/hot cache hits, mesurer les temps d'exécution
  • Performance Analyzer Power BI — identifier les visuels lents, voir le DAX généré
  • Éviter les colonnes calculées — préférer les mesures quand possible (calcul à la volée vs stockage)
  • Limiter les relations bidirectionnelles — elles multiplient les chemins de filtrage et ralentissent
  • VertiPaq Analyzer — analyser la taille du modèle, identifier les colonnes à fort cardinal

Signal GO Senior : le candidat mentionne spontanément DAX Studio, parle de cardinalité et de compression VertiPaq. Un profil qui n'a jamais ouvert DAX Studio n'a pas optimisé de modèle réel.

7Grille par niveau

NiveauMaîtrise DAX attendueSignal GONO-GO
JuniorSUM, COUNT, CALCULATE simple, mesures de baseComprend la différence mesure vs colonne calculée, utilise DIVIDENe connaît pas CALCULATE, confond mesure et colonne calculée
ConfirméCALCULATE avancé, VAR/RETURN, time intelligence, SUMX/RANKXExplique la transition de contexte, utilise VAR systématiquement, maîtrise SAMEPERIODLASTYEARNe sait pas pourquoi VAR améliore les performances
SeniorOptimisation, DAX Studio, patterns avancés (semi-additive, security)Cite DAX Studio, parle de cardinalité, a implémenté du RLS dynamiqueN'a jamais utilisé DAX Studio, ne connaît pas les mesures semi-additives
LeadArchitecture du modèle sémantique, standards d'équipe, revues DAXA défini des conventions de nommage DAX pour une équipe, a migré vers Fabric/SSASNe peut pas expliquer ses choix d'architecture sémantique

Vous recrutez un Data Analyst Power BI ?

Premier entretien gratuit. Rapport GO/NO-GO sous 48h.

Tester gratuitementRéserver un appel