IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POWER Discussion :

Conserver des éléments uniques sauf pour certaines valeurs avec contraintes


Sujet :

POWER

  1. #1
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 952
    Points : 28 960
    Points
    28 960
    Billets dans le blog
    53
    Par défaut Conserver des éléments uniques sauf pour certaines valeurs avec contraintes
    Bonjour,
    Je voudrais réaliser à l’aide de Power Query une liste unique des éléments se trouvant dans la table de gauche mais avec certaines contraintes
    S’il y un "X" dans la colonne « Adr », c’est cette ligne qui doit être conservée et s’il y a un "O" dans la colonne « Dispatch » toutes les lignes ayant la même valeur dans la colonne « Facturation » doivent être copiées
    Merci pour vos lumières

    Nom : Test Dispatch .png
Affichages : 142
Taille : 38,4 Ko

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 667
    Points : 1 432
    Points
    1 432
    Par défaut
    Bonjour Philippe,

    Le cas où l'on a à la fois X et O pour des lignes (potentiellement différentes) correspondant à la même facturation et le cas où l'on a ni l'un ni l'autre mais tout de même plusieurs lignes pour la même facturation n'étant pas adressés (car potentiellement impossibles?), j'ai opté pour un OU(X absent, O présent) comme critère de récupération de toutes les lignes pour une facturation donnée, à adapter bien sûr selon le besoin réel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let
        Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Facturation", type text}, {"Filiale", type text}, {"Adr", type text}, {"Dispatch", type text}, {"Nbre", Int64.Type}}),
        #"Grouped Rows" = Table.Group(#"Changed Type", {"Facturation"}, {{"Lignes", each _, type table}, {"Dispatch O?", each List.Max([Dispatch]), type text}, {"Adr X?", each List.Max([Adr]), type text}}),
        #"Filtered subrows" = Table.AddColumn(#"Grouped Rows", "Lignes filtrées", each if [#"Dispatch O?"] = "O" or [#"Adr X?"] = null then [Lignes] else Table.SelectRows([Lignes], each _[Adr] = "X"), Value.Type(#"Grouped Rows"[Lignes]{0})),
        #"Removed Columns" = Table.RemoveColumns(#"Filtered subrows",{"Lignes", "Dispatch O?", "Adr X?"}),
        #"Expanded {0}" = Table.ExpandTableColumn(#"Removed Columns", "Lignes filtrées", {"Filiale"}, {"Filiale"})
    in
        #"Expanded {0}"
    On aurait pu faire sans les colonnes intermédiaires "Dispatch O?" et "Adr X?" en travaillant directement sur les tables contenues dans chaque case de la colonne Lignes obtenues par regroupement (par exemple en créant une fonction personnalisée travaillant sur chacune de ces tables) mais la méthode ci-dessus m'a semblé plus simple (avec l'astuce du List.Max pour savoir s'il y a au moins un X ou au moins un O dans les lignes regroupées).
    Cette astuce fonctionne bien sur l'exemple où l'on a soit X, soit null (resp. soit O, soit null).

    Note que le "Value.Type(#"Grouped Rows"[Lignes]{0})" me permet de récupérer le type de la colonne Lignes (contenant les tables regroupées) et de l'appliquer directement sur la nouvelle colonne "Nouvelles lignes" (contenant les tables regroupées ET filtrées) sans avoir à réfléchir ni maintenir les types colonne par colonne.

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 952
    Points : 28 960
    Points
    28 960
    Billets dans le blog
    53
    Par défaut
    Bonjour Promethee,
    Un tout grand merci et bravo pour la simplicité
    J'étais parti avec une création d'une ou deux tables en mémoire mais je m'étais emmêlé les pinceaux.

  4. #4
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 129
    Points : 2 675
    Points
    2 675
    Par défaut
    Bonjour Philippe, Promethee

    Je pense qu'on peut aussi passer par une fusion.
    On filtre les X dans le champ Adr, on remplace ces X par des null et on fusionne la source et les lignes que l'on vient de sélectionner en LeftAnti sur les champs "Facturation" et "Adr" pour exclure ces lignes.
    Il ne reste plus qu'à supprimer la colonne de fusion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let
        Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
        #"Lignes filtrées" = Table.SelectRows(Source, each [Adr] = "X"),
        #"Valeur remplacée" = Table.ReplaceValue(#"Lignes filtrées","X",null,Replacer.ReplaceValue,{"Adr"}),
        #"Requêtes fusionnées" = Table.NestedJoin(Source, {"Facturation", "Adr"}, #"Valeur remplacée", {"Facturation","Adr"}, "Filtre", JoinKind.LeftAnti),
        #"Colonnes supprimées" = Table.RemoveColumns(#"Requêtes fusionnées",{"Filtre"})
    in
        #"Colonnes supprimées"
    Stéphane

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 952
    Points : 28 960
    Points
    28 960
    Billets dans le blog
    53
    Par défaut
    Bonjour Stéphane,
    Merci pour cette autre solution intéressante mais lorsque un "O" se trouve présent dans la colonne Dispatch et un "X" dans la colonne Adr il faudrait obtenir une ligne par filiale comme la ligne ayant comme code de facturation S011

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supression dans une table sauf pour certaine valeurs
    Par Nikimizi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/03/2013, 15h15
  2. [VxiR2] rupture conditionelle (afficher que pour certaine valeur)
    Par pierregaya dans le forum Webi
    Réponses: 8
    Dernier message: 16/10/2009, 10h06
  3. Réponses: 0
    Dernier message: 18/08/2009, 12h00
  4. Réponses: 2
    Dernier message: 17/03/2009, 15h01
  5. Utiliser des champs de recherche pour une valeur calculée.
    Par MasterJul dans le forum SharePoint
    Réponses: 0
    Dernier message: 08/02/2008, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo