top of page
Rechercher

ALLEXCEPT dans Power BI : garder un filtre, supprimer tous les autres

Groupe Kronoscope
5 oct.
6 min de lecture

ALLEXCEPT supprime les filtres d'une table, sauf ceux que vous citez.

Son écriture est inversée : vous nommez ce que vous gardez, pas ce que vous retirez.

C'est la fonction du pourcentage à l'intérieur d'un groupe.

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




Télécharger l'exercice ALLEXCEPT en DAX

Le pack est gratuit et ne demande aucune inscription.

Il contient tout ce qu'il faut pour refaire la démonstration.

  • Un classeur Excel avec la table Ventes complète, soit 60 lignes.

  • Huit questions corrigées, avec validation automatique de vos réponses.

  • Un onglet Exemple qui reprend exactement les cinq lignes ci-dessous.

  • Un fichier texte contenant les sept mesures DAX de l'article.

La validation s'affiche dès que votre réponse est correcte.

Les données du classeur sont fictives. Elles ne décrivent aucune entreprise réelle.



Un exemple simple pour comprendre ALLEXCEPT

Prenons cinq lignes de ventes. Chaque ligne porte une ville, sa région et un chiffre d'affaires.

Ville

Région

CA

Lyon

Sud-Est

40 000 €

Grenoble

Sud-Est

20 000 €

Lille

Nord

25 000 €

Amiens

Nord

15 000 €

Nantes

Ouest

20 000 €

Le total vaut 120 000 €. Le Sud-Est pèse 60 000 €, le Nord 40 000 €, l'Ouest 20 000 €.

Plaçons ces données dans une matrice. La région en lignes, la ville en sous-lignes.

Voici la mesure qui calcule le chiffre d'affaires de la région.

CA de la région =
CALCULATE (
    [CA total],
    ALLEXCEPT ( Ventes, Ventes[Région] )
)

Plaçons-nous sur la ligne Lyon. Le visuel y pose deux filtres.

Le premier vaut Région égale Sud-Est. Le second vaut Ville égale Lyon.

ALLEXCEPT retire le filtre de ville. Il conserve celui de région, la seule colonne citée.

Ville

Région

CA

Retenu ?

Lyon

Sud-Est

40 000 €

✓

Grenoble

Sud-Est

20 000 €

✓

Lille

Nord

25 000 €

✗

Amiens

Nord

15 000 €

✗

Nantes

Ouest

20 000 €

✗

Total



60 000 €

La ligne Lyon affiche donc 60 000 €. C'est le chiffre d'affaires de toute sa région.

ALLEXCEPT n'a rien additionné. Il a seulement décidé quels filtres survivent au calcul.

Schéma des quatre colonnes filtrées d'une table Ventes. Seule la colonne Région, citée par ALLEXCEPT, conserve son filtre.

Syntaxe

ALLEXCEPT ( <table>, <colonne> [, <colonne> [, …] ] )

table : la table dont les filtres sont supprimés.

colonne : la colonne dont le filtre doit être conservé.

Le premier argument doit être une table de base. Les suivants doivent être des colonnes de base.

Aucune expression de table ni de colonne n'est acceptée.

Au moins une colonne est obligatoire. Sans elle, écrivez plutôt ALL ou REMOVEFILTERS.


Le sens inversé : vous citez ce que vous gardez

C'est la source de confusion la plus fréquente.

ALL cite ce qu'il supprime. ALLEXCEPT cite ce qu'il conserve.

Écriture

Ce qu'elle fait

ALL ( Ventes[Ville] )

Supprime le seul filtre posé sur la colonne Ville

ALLEXCEPT ( Ventes, Ventes[Ville] )

Supprime tous les filtres de Ventes, sauf celui de Ville

Les deux écritures ne sont donc pas équivalentes. Elles sont presque opposées.



Le pourcentage à l'intérieur d'un groupe

Voici le cas d'usage principal de la fonction.

Vous voulez la part de chaque ville dans sa propre région.


La mesure, pas à pas

Le numérateur reste soumis au contexte du visuel.

Le dénominateur doit remonter au niveau de la région. C'est le travail d'ALLEXCEPT.

% de la région =
VAR CaVille = [CA total]
VAR CaRegion =
    CALCULATE (
        [CA total],
        ALLEXCEPT ( Ventes, Ventes[Région] )
    )
RETURN
    DIVIDE ( CaVille, CaRegion )

Sur la ligne Lyon, le numérateur vaut 40 000 €. Le dénominateur vaut 60 000 €.

La part affichée est donc de 66,7 %.

Les variables ne changent pas le résultat. Elles rendent la mesure lisible et facile à déboguer.

La fonction DIVIDE protège le calcul si une région se retrouve sans vente.


La ligne de région affiche 100 %

Le comportement se répète à chaque niveau de la matrice.

Sur la ligne Sud-Est, aucun filtre de ville n'est actif.

Le numérateur et le dénominateur valent alors tous les deux 60 000 €.

La ligne de région affiche donc 100 %. C'est le sens même d'un pourcentage de groupe.



Le piège n°1 : ALLEXCEPT ne pose aucun filtre

Voici l'erreur qui produit des chiffres faux en silence.

Retirez la région de la matrice. Ne gardez que la ville en lignes.

La mesure ne change pas. Le résultat, lui, change du tout au tout.

ALLEXCEPT cherche un filtre à conserver sur la colonne Région. Il n'en trouve aucun.

Il ne le crée pas pour autant. Il supprime donc tout le contexte de la table.

Le dénominateur devient le total général, soit 120 000 €.

Sur la ligne Lyon, la part tombe à 33,3 %. La valeur attendue était 66,7 %.


Attention

ALLEXCEPT conserve un filtre existant. Il n'en ajoute jamais.

Si la colonne citée n'est filtrée nulle part, la fonction efface tout le contexte de la table.


Le symptôme à repérer

Un pourcentage de groupe dont l'ensemble des lignes totalise 100 % trahit ce défaut.

Chaque groupe devrait totaliser 100 % de son côté, pas le visuel entier.

Posez une mesure de contrôle pour lever le doute.

Région filtrée ? =
ISFILTERED ( Ventes[Région] )

Si elle renvoie Faux, ALLEXCEPT ne conserve rien.


La parade : REMOVEFILTERS puis VALUES

Cette écriture est plus longue. Elle ne dépend pas de la disposition du visuel.

% de la région =
DIVIDE (
    [CA total],
    CALCULATE (
        [CA total],
        REMOVEFILTERS ( Ventes ),
        VALUES ( Ventes[Région] )
    )
)

REMOVEFILTERS vide le contexte de la table. VALUES relit la région visible, puis la réapplique.

Sur la ligne Lyon, VALUES renvoie Sud-Est, même si la colonne n'est pas affichée.

Le dénominateur redevient 60 000 €, dans les deux dispositions de matrice.



Le piège n°2 : la table étendue

Le second piège apparaît dès que le modèle compte plusieurs tables.

Reprenons un schéma en étoile. La table Ventes porte les montants.

Les tables Villes, Calendrier et Canaux portent les colonnes d'analyse.

Vous écrivez cette mesure pour ne conserver que le canal.

CA du canal =
CALCULATE (
    [CA total],
    ALLEXCEPT ( Ventes, Ventes[Canal] )
)

Vous attendez la suppression des seuls filtres posés sur les colonnes de Ventes.

Le moteur fait beaucoup plus.


Ce que la table étendue change

ALLEXCEPT agit sur la table étendue de Ventes.

Cette table virtuelle contient aussi les colonnes de toutes les tables liées.

Le lien doit être une relation régulière plusieurs-à-un. C'est le cas d'un schéma en étoile.

Les filtres de Villes, de Calendrier et de Canaux disparaissent donc également.

Le segment de région posé par votre lecteur s'évapore sans aucun avertissement.

Ce comportement vaut aussi pour ALL et REMOVEFILTERS appliqués à une table entière.

Schéma en étoile montrant que la table étendue de Ventes englobe les tables de dimension reliées.

Viser la table de dimension

La règle tient en une phrase.

Appliquez ALLEXCEPT à la table qui porte réellement les colonnes d'analyse.

CA de la région =
CALCULATE (
    [CA total],
    ALLEXCEPT ( Villes, Villes[Région] )
)

La table Villes se trouve du côté un de la relation.

Sa table étendue se limite à elle-même. Le périmètre supprimé redevient prévisible.

L'expansion ne joue pas sur les relations limitées, comme une cardinalité plusieurs-à-plusieurs.



Les limites à connaître

Ce que la fonction refuse

  • Le premier argument doit être une table de base, jamais une expression.

  • Les arguments suivants doivent être des colonnes de base.

  • Au moins une colonne est obligatoire.

  • Employée seule, elle renvoie une table. Dans CALCULATE, elle modifie le contexte.

ALLEXCEPT renvoie une table. Elle peut donc alimenter un itérateur, contrairement à REMOVEFILTERS.


Contextes non pris en charge

Trois restrictions méritent d'être retenues.

Contexte

ALLEXCEPT

Calcul visuel

Non prise en charge

Colonne calculée en DirectQuery

Non prise en charge

Règle de sécurité au niveau des lignes en DirectQuery

Non prise en charge

La première ligne distingue ALLEXCEPT de ALL et de REMOVEFILTERS.

Ces deux dernières sont acceptées dans les calculs visuels. Pas ALLEXCEPT.

La documentation Microsoft confirme ces trois restrictions.



Ce qu'il faut retenir

  • ALLEXCEPT cite les colonnes à conserver, pas celles à supprimer.

  • Son cas d'usage principal est le pourcentage à l'intérieur d'un groupe.

  • La fonction conserve un filtre existant. Elle n'en crée jamais.

  • Sans filtre sur la colonne citée, le calcul retombe sur le total général.

  • La suppression porte sur la table étendue, donc sur les tables de dimension liées.

  • Visez la table de dimension, ou préférez REMOVEFILTERS avec VALUES.

Le classeur d'exercices permet de vérifier chacun de ces points.

Si le mécanisme du contexte de filtre ne vous parle pas encore, relisez notre article sur la fonction CALCULATE.

[[ LIENS INTERNES à ajouter après publication : ALL, KEEPFILTERS, DIVIDE ]]

 
 
bottom of page