top of page
Rechercher

ALL dans Power BI : ignorer les filtres et calculer un pourcentage du total

Groupe Kronoscope
il y a 3 jours
5 min de lecture

ALL est la fonction de filtre la plus mal comprise du langage DAX. Elle ne calcule rien : elle supprime des filtres pour permettre à une autre fonction d'effectuer le calcul. Placée au mauvais endroit, elle peut même ne supprimer aucun filtre.


Cet article démontre son comportement sur un jeu de données fictif, valeur par valeur.




Télécharger l'exercice ALL en DAX

Le pack contient 90 lignes de ventes réparties sur six produits et trois catégories. Vous y trouverez cinq exercices avec validation automatique, leur corrigé détaillé et les mesures DAX prêtes à coller.

Les données sont entièrement fictives. Elles ne décrivent aucune entreprise réelle.




Un exemple simple pour comprendre ALL

Prenons une table de cinq lignes. Chaque ligne porte un produit, sa catégorie et un chiffre d'affaires.


Produit

Catégorie

CA

Clavier

Périphériques

12 000 €

Souris

Périphériques

8 000 €

Casque

Périphériques

20 000 €

Écran 24 pouces

Écrans

25 000 €

Écran 27 pouces

Écrans

35 000 €


La somme complète vaut 100 000 €. Les Écrans pèsent 60 000 €, les Périphériques 40 000 €. Voici la mesure qui calcule la part de chaque catégorie.

% du total =
DIVIDE (
    SUM ( Ventes[CA] ),
    CALCULATE ( SUM ( Ventes[CA] ), ALL ( Produits[Catégorie] ) )
)

Plaçons-nous sur la ligne Écrans du visuel. Vérifions le calcul ligne par ligne.

Produit

Catégorie

CA

Retenu au numérateur ?

Retenu au dénominateur ?

Clavier

Périphériques

12 000 €

Souris

Périphériques

8 000 €

Casque

Périphériques

20 000 €

Écran 24 pouces

Écrans

25 000 €

Écran 27 pouces

Écrans

35 000 €

Total



60 000 €

100 000 €

Le numérateur vaut 60 000 €, le dénominateur 100 000 €. La part affichée est donc de 60 %.

ALL n'a rien additionné. Il a seulement retiré le filtre de catégorie du dénominateur.


Syntaxe

ALL ( [<table> | <colonne> [, <colonne> [, …]]] )

L'argument doit être une table de base ou une colonne de base. Une expression de table est refusée.

ALL joue en réalité deux rôles distincts. Employée dans CALCULATE, elle supprime des filtres. Employée seule, elle renvoie une table.


Les trois écritures de ALL

Le périmètre supprimé dépend entièrement de l'argument passé.

Écriture

Ce qu'elle supprime

ALL ( Produits )

Tous les filtres de la table Produits, colonne par colonne

ALL ( Produits[Catégorie] )

Le seul filtre posé sur la colonne Catégorie

ALL ( Produits[Catégorie], Produits[Produit] )

Les filtres de ces deux colonnes, qui doivent venir de la même table

ALL ( )

Tous les filtres du modèle, uniquement à l'intérieur de CALCULATE



Schéma comparant les trois écritures de la fonction ALL en DAX. Le visuel est filtré sur la catégorie et sur le canal. Chaque colonne indique les filtres supprimés et le dénominateur obtenu.



Calculer un pourcentage du total avec ALL

Le pourcentage du total reste le cas d'usage numéro un de la fonction.

La mesure, pas à pas

Le numérateur reste soumis au contexte du visuel. Le dénominateur doit l'ignorer. C'est exactement le travail de ALL.

% du total catégorie =
VAR CaLigne   = [CA total]
VAR CaGeneral = CALCULATE ( [CA total], ALL ( Produits[Catégorie] ) )
RETURN
    DIVIDE ( CaLigne, CaGeneral )

Les variables ne changent pas le résultat. Elles rendent la mesure lisible et plus facile à déboguer. La fonction DIVIDE protège le calcul quand le dénominateur vaut zéro.


La ligne de total affiche 100 %

Le total du visuel n'échappe pas à la règle. À ce niveau, aucun filtre de catégorie n'est actif. Le numérateur vaut alors 100 000 €, comme le dénominateur.

La ligne de total affiche donc 100 %. Ce comportement est normal. Il surprend pourtant beaucoup de lecteurs de rapports.



Le piège du schéma en étoile

Voici l'erreur qui coûte le plus de temps en formation. Le modèle est en étoile. La catégorie vit dans la table Produits, les montants dans la table Ventes.

Beaucoup de mesures fausses ressemblent à celle-ci.

% faux =
DIVIDE (
    [CA total],
    CALCULATE ( [CA total], ALL ( Ventes ) )
)

Schéma comparant deux mesures de pourcentage du total dans un modèle en étoile. À gauche, ALL est posé sur la table de faits Ventes. Le filtre traverse la relation et la mesure renvoie 100 % sur chaque ligne. À droite, ALL cible la colonne Catégorie de la table Produits. Le dénominateur redevient correct.


Pourquoi ALL ( Ventes ) ne supprime rien

ALL ( Ventes ) retire bien les filtres posés sur les colonnes de Ventes. Or le filtre du visuel porte sur Produits[Catégorie]. Il reste actif, puis traverse la relation.

Le dénominateur retombe donc sur les seules ventes d'écrans. Il vaut 60 000 €, comme le numérateur. Chaque ligne affiche 100 %.


La correction

Ciblez la table qui porte réellement le filtre.

% du total =
DIVIDE (
    [CA total],
    CALCULATE ( [CA total], ALL ( Produits[Catégorie] ) )
)

La règle tient en une phrase. ALL doit désigner la colonne affichée dans le visuel, pas la table de faits.


Retenez bien

Un visuel qui affiche 100 % sur toutes ses lignes révèle souvent la même erreur : ALL a été appliqué sur la table de faits alors que le filtre provient d'une table de dimension.



ALL ou REMOVEFILTERS : lequel écrire ?

Microsoft a introduit REMOVEFILTERS en 2019. Sa documentation recommande cette fonction dès qu'il s'agit seulement de supprimer des filtres.

Les deux écritures donnent le même résultat dans CALCULATE. La différence se joue ailleurs.

Fonction

Supprime des filtres

Renvoie une table

ALL

Oui

Oui

REMOVEFILTERS

Oui

Non

REMOVEFILTERS ne sert que de modificateur. Elle ne peut pas alimenter un itérateur ni une fonction de classement.

Classement produit =
RANKX (
    ALL ( Produits[Produit] ),
    [CA total],
    ,
    DESC,
    DENSE
)

Ici, ALL fournit la liste des produits à classer. REMOVEFILTERS provoquerait une erreur à cet emplacement.

Adoptez une convention d'écriture. REMOVEFILTERS quand vous supprimez, ALL quand vous renvoyez une table. L'intention devient lisible dès la relecture.



ALL, ALLEXCEPT et ALLSELECTED : ne pas confondre

Quatre fonctions se partagent le travail de suppression. Elles ne répondent pas au même besoin.

Fonction

Ce qu'elle fait

Cas d'usage typique

ALL

Supprime les filtres visés et renvoie une table

Pourcentage du total général

REMOVEFILTERS

Supprime les filtres visés, sans renvoyer de table

La même chose, en plus lisible

ALLEXCEPT

Supprime tous les filtres d'une table, sauf ceux des colonnes citées

Pourcentage à l'intérieur d'une catégorie

ALLSELECTED

Ignore les filtres du visuel, garde la sélection de l'utilisateur

Pourcentage du total affiché

La nuance ALLSELECTED mérite un exemple. Un segment limite le rapport à deux catégories sur trois.


Avec ALL, le dénominateur reste le total des trois catégories. Avec ALLSELECTED, il vaut le total des deux catégories retenues.

Le second comportement correspond presque toujours à l'attente du lecteur.



Les pièges de ALL en production

L'effet auto-exist

Un cas documenté par Microsoft mérite l'attention. Filtrez deux colonnes de la même table avec deux segments. Ajoutez une mesure de cette table qui utilise ALL.

Le moteur fusionne alors les deux filtres. Il ne conserve que les combinaisons de valeurs qui existent réellement. Le calcul porte sur des données filtrées, et non sur toutes les données.

Ce mécanisme d'optimisation s'appelle auto-exist. Il reste rare. Il rend surtout le diagnostic très difficile, car la mesure ne lève aucune erreur.


Les limites à connaître

  • L'argument doit être une table de base ou une colonne de base. Une expression est refusée.

  • Les colonnes passées à ALL doivent toutes appartenir à la même table.

  • ALL sans argument ne fonctionne que comme modificateur de CALCULATE.

  • ALL est refusée en mode DirectQuery, dans une colonne calculée ou une règle de sécurité au niveau des lignes.

La documentation Microsoft confirme ces quatre limites.



En résumé

ALL supprime les filtres que vous lui désignez, et rien d'autre. Le reste du contexte continue de s'appliquer.

Visez toujours la colonne affichée dans le visuel. Écrivez REMOVEFILTERS quand vous supprimez, ALL quand vous avez besoin d'une table.


Le pourcentage du total est souvent la première mesure avancée d'un rapport. L'article sur CALCULATE explique comment un filtre est remplacé. Celui sur SUM rappelle la différence entre une colonne et une mesure.

 
 
bottom of page