top of page
Rechercher

Fonction FILTER dans Power BI : filtrer une table en DAX

Groupe Kronoscope
27 août
5 min de lecture

FILTER parcourt une table ligne par ligne en DAX.


La fonction ne renvoie jamais un nombre : elle renvoie une table. Cette distinction est essentielle pour comprendre son fonctionnement et éviter les erreurs.


Voici comment utiliser FILTER, avec sa syntaxe, des exemples concrets et surtout les situations dans lesquelles il vaut mieux ne pas l’utiliser.




Télécharger notre exercice FILTER en DAX

Le pack contient un classeur de 200 lignes de commandes fictives.

Trois tables sont fournies : Ventes, Produits et Commerciaux.

Cinq mesures sont à construire à l’aide de la fonction FILTER.

La validation s’affiche automatiquement dès que vous saisissez votre résultat.




Les données sont entièrement fictives. Elles servent uniquement de support pédagogique.



FILTER en un exemple : cinq commandes, une condition

Prenons une table de cinq commandes seulement.

La condition est simple : garder les montants supérieurs à 3 000 €.

  • CMD-1001 : 1 250 € — condition fausse, ligne écartée

  • CMD-1002 : 4 800 € — condition vraie, ligne conservée

  • CMD-1003 : 620 € — condition fausse, ligne écartée

  • CMD-1004 : 3 900 € — condition vraie, ligne conservée

  • CMD-1005 : 2 100 € — condition fausse, ligne écartée


FILTER teste chaque ligne, l’une après l’autre.

Il conserve deux lignes sur cinq et retourne une table contenant uniquement ces deux lignes.


Cette table ne contient aucun total : elle contient uniquement les lignes qui respectent la condition.


SUMX parcourt ensuite ces deux lignes et additionne leurs montants :

4 800 + 3 900 = 8 700 €


CA grosses lignes =
SUMX (
    FILTER ( Ventes, Ventes[Montant] > 3000 ),
    Ventes[Montant]
)

filter-dax-table-virtuelle : FILTER revoie une table explication

Retenez ce point : FILTER prépare la matière, une autre fonction produit le chiffre.



La syntaxe de FILTER

Syntaxe

FILTER ( <table> ; <condition> )

Deux paramètres obligatoires. Une table en sortie, jamais une valeur.

Le premier paramètre : la table parcourue

Ce paramètre accepte une table du modèle de données.

Il accepte aussi toute expression qui renvoie une table.

VALUES ( Ventes[Zone] ) et ALL ( Produits ) sont donc valides.

Le choix de cette table décide du coût de la mesure.


Le second paramètre : la condition testée

La condition est évaluée ligne par ligne, séparément.

Elle renvoie VRAI ou FAUX pour chaque ligne parcourue.

FILTER crée ainsi un contexte de ligne.


C’est ce contexte qui autorise RELATED à l’intérieur de la condition.

La documentation Microsoft le rappelle : FILTER ne s’utilise jamais seul.

Écrite seule dans une mesure, la fonction déclenche une erreur.

Une mesure doit produire une valeur unique, pas une table.



FILTER dans CALCULATE : le piège du filtre écrasé

Ce que CALCULATE fait de votre table

CALCULATE remplace les filtres qui portent sur les mêmes colonnes.

Imaginons un segment de zone posé sur votre page.

L’utilisateur sélectionne la zone Sud. Votre mesure filtre la zone Nord.

Le chiffre affiché sera celui du Nord.

Le segment est ignoré, sans le moindre message d’avertissement.

C’est la première cause de chiffres faux inexpliqués en réunion.


KEEPFILTERS, la version qui ne casse rien

KEEPFILTERS croise les deux filtres au lieu de les remplacer, comme le documente Microsoft.

La sélection de l’utilisateur est alors respectée.

-- Le filtre du segment est écrasé
CA Nord =
CALCULATE ( [CA], FILTER ( Ventes, Ventes[Zone] = "Nord" ) )

-- Le filtre du segment est respecté
CA Nord =
CALCULATE ( [CA], KEEPFILTERS ( Ventes[Zone] = "Nord" ) )

Condition simple

Une seule colonne, aucune mesure appelée. Écrivez une expression booléenne : Microsoft la recommande pour les performances.

Condition complexe

Une mesure, deux colonnes ou deux tables. FILTER devient alors la seule écriture possible.

Microsoft publie une page entière sur ce point : éviter FILTER comme argument de filtre.

La raison est technique. Les tables importées sont stockées en colonnes, en mémoire.

Le moteur est optimisé pour filtrer une colonne, pas pour parcourir des lignes.


filter-dax-booleen-ou-filter


Les cas où FILTER reste obligatoire

Une expression booléenne connaît des limites précises.

Elle ne peut ni appeler une mesure, ni référencer deux tables.

Dans ces situations, FILTER n’est plus un choix de style.

La condition appelle une mesure

Objectif : le chiffre d’affaires des commerciaux au-dessus de leur objectif.

La condition compare une mesure à une colonne.

Aucune expression booléenne n’accepte cette écriture.

CA au-dessus objectif =
CALCULATE (
    [CA],
    FILTER ( Commerciaux, [CA] > Commerciaux[Objectif annuel] )
)

L’itération porte ici sur cinq lignes de commerciaux.

La condition compare deux colonnes

Objectif : le chiffre d’affaires des lignes vendues sous le prix catalogue.

Le prix de vente est dans Ventes. Le prix catalogue est dans Produits.

RELATED va chercher la valeur dans la table liée.

CA lignes remisées =
CALCULATE (
    [CA],
    FILTER (
        Ventes,
        Ventes[Prix unitaire] < RELATED ( Produits[Prix catalogue] )
    )
)

Un troisième cas existe : un OU logique entre deux tables différentes.

Là encore, seule la version table fonctionne.



Performances : sur quelle table itérer

Filtrer la dimension plutôt que la table de faits

Un itérateur coûte le nombre de lignes qu’il parcourt.

Filtrer la table Produits revient à tester huit lignes.

Filtrer la table Ventes peut revenir à en tester deux millions.

Le résultat est identique. Le temps de réponse ne l’est pas.

-- Lourd : itération sur la table de faits
CALCULATE ( [CA], FILTER ( Ventes, RELATED ( Produits[Prix catalogue] ) > 300 ) )

-- Léger : itération sur la dimension
CALCULATE ( [CA], KEEPFILTERS ( Produits[Prix catalogue] > 300 ) )

Une seule itération plutôt que deux FILTER imbriqués

Deux conditions n’exigent pas deux FILTER.

L’opérateur && les combine dans un seul parcours.

-- Deux parcours de table
CALCULATE ( [CA], FILTER ( FILTER ( Ventes, Ventes[Zone] = "Nord" ), Ventes[Montant] > 3000 ) )

-- Un seul parcours
CALCULATE ( [CA], FILTER ( Ventes, Ventes[Zone] = "Nord" && Ventes[Montant] > 3000 ) )

Bon à savoir

Avant d’optimiser, mesurez. L’analyseur de performances de Power BI Desktop indique le temps réel de chaque visuel.



Questions fréquentes sur FILTER

Quelle différence entre FILTER et CALCULATE ?

FILTER produit une table filtrée. CALCULATE modifie le contexte d’un calcul.

L’une prépare, l’autre applique. Elles se complètent, elles ne se remplacent pas.


Pourquoi ma mesure renvoie-t-elle une erreur ?

Parce que la mesure se termine sur une table.

Encadrez FILTER par SUMX, COUNTROWS ou CALCULATE.


FILTER peut-il créer une table calculée ?

Oui. La fonction est acceptée dans une table calculée et dans une colonne calculée.

La table obtenue est alors stockée dans le modèle, avec son coût mémoire.


FILTER remplace-t-il un segment ?

Non. Un segment filtre le rapport pour l’utilisateur.

FILTER fige une règle métier dans la mesure elle-même.

Pour aller plus loin, lisez notre fiche sur la fonction DISTINCTCOUNT, qui pose un autre piège classique du DAX.



Un projet Power BI en cours ?

Nos formateurs sont aussi développeurs Power BI. Profitez d’un rendez-vous téléphonique offert pour cadrer votre besoin.


 
 
bottom of page