[PowerQuery] - Compléter une colonne par déduction

Bonjour,

Je viens à vous désespéré et à cours de solutions...

J'ai une requête sur PowerQuery que nous appellerons "Affaires". Chaque ligne de cette requête représente une affaire/prestation effectuée chez un de mes clients.

Sur la requête "Affaire", j'ai plusieurs colonnes, notamment les colonnes "Client" et "Business Unit". Pour rappel, puisque chaque ligne représente une affaire, un seul et même client peut apparaître plusieurs fois dans la colonne "Client".

Il se trouve que ma source de donnée n'a que peu d'informations sur la colonne "Business Unit" qui est remplie à environ 60%. Je souhaite compléter cette colonne "Business Unit" comme il suit:
Certains clients ont leur champ "Business unit" indiqué pour une ligne, mais pas sur les autres. C'est à dire que le client "Machin" peut apparaître sur 4 lignes et n'avoir qu'une seule de ses lignes indiquant sa donnée "Business Unit". J'aimerais, pour ce cas là, que la colonne "Business Unit" indique la valeur existante pour les 4 lignes du client "Machin".
Attention cependant, il y a certains cas où un client lambda n'a pas de données dans le champ "Business Unit", dans aucune de ses lignes. Dans ce cas là, je ne veux surtout rien faire et laisser le "null" tel quel.

ChatGPT répond à côté de la plaque, il m'a mené vers l'agrégation, le remplissage vers le bas... mais rien n'y fait. Voici ci-dessous un exemple de ce à quoi ressemble ma requête:

Business UnitColonne XClient
nullMachin
AAAMachin
nullMachin
nullTruc
nullTruc
nullBidule
BBBBidule
BBBBidule
nullBidule
nullBidule
BBBBidule

Et voici le résultat attendu:

Business UnitColonne X
Client
AAA

Machin
AAA

Machin
AAA

Machin
null

Truc
null

Truc
BBB

Bidule
BBB

Bidule
BBB

Bidule
BBB

Bidule
BBB

Bidule
BBB

Bidule

La Colonne X est là pour indiquer que mes deux colonnes ne sont pas nécessairement voisines. Pour rappel, j'ai un très grand nombre de données dans cette requête et aimerais autant avoir une solution assez optimisée pour ne pas que le fichier mette 50 ans à charger :D Mais au point où j'en suis je suis ouvert à toute les suggestions.

Pouvez-vous m'aider ?

Merci d'avance !

Hello,

Une proposition PowerQuery

CHATGpt ne remplacera jamais le savoir des Exceliens présents sur ce forum

@+

Bonjour,

Heureux de voir que ChatGPT n'a pas encore surpassé l'humain, du moins dans certaines catégories

Joli code, Baroute

@Baroute78 Bonjour et merci d'avoir pris le temps de répondre avec un joli tableau !

Très heureux de voir que cela marche, je commençais à me dire que c'était impossible...! ChatGPT n'est décidément absolument pas à la hauteur des génies d'ici :D

Pourrais-tu juste s'il te plaît me décrire précisément ce que tu fais à partir de la 3ème étape "GroupBy" ? J'essaye de reproduire cela de mon côté mais je n'y parviens pas...

[EDIT]
Je pense judicieux de préciser que ma requête contient un très grand nombre de colonnes différentes (une bonne trentaine).

En conséquence, la formule de l'étape "GroupBy" devrait ressembler à cela:

= Table.Group(Replace, {"Client", "Colonne X","ColonneY",ColonneZ","ColonneAA","ColonneBB"}, {{"Business Unit", each Table.FillDown(Table.FillUp(_,{"Business Unit"}),{"Business Unit"}) }})

C'est bien cela ? Car... Cela ne fonctionne pas pour ma base de données... :(

Hello,

@cousinhub, bien le bonjour

@TonyMon, tu vas vite comprendre que ça ne casse pas trois pattes à un canard

En gros : pour le GroupBy je suis parti de ça :

image

Après j'ai enlevé cette partie qui ne sert pas dans ce cas là dans la ligne de code générée :

image

A partir de là c'est un jeu d'enfant, le "each _" signifie "chaque enregistrement de la sous table"

image

Donc dans un premier temps j'ai fait :

Un Table.FillUp sur la colonne Business Unit de la sous table pour remplir vers le haut

image

Puis sur cette sous table modifiée, j'effectue le Table.FillDown pour remplir vers le bas

image

Est ce plus clair ?

Edit :

- Il n'y a pas d'options avec l'assistant pour générer la ligne de code Table.FillUp et Table.FillDown de manière automatique. C'est écrit à la main.

- L'ordre des colonnes est inversé car c'est lié au GroupBy

@+

@Baroute78

Merci beaucoup pour toute ces informations et les screenshots bien détaillés ! J'ai réussi à reproduire la même chose, mais pas sur mon gros fichier... Je ne sais pas à quoi c'est dû.

En gros la seule différence notable c'est que j'ai sélectionné toute mes colonnes pour ensuite cliquer sur "Regrouper par", ce qui me les a toutes mise dans la catégorie des regroupements. J'ai bien modifié l'opération dans la suite de la formule à la main, puis j'ai développé le groupement pour n'afficher que la colonne "Business Unit".

Malheureusement, j'ai encore la plupart des données qui me manquent :(

Hello,

La seule étape intervenant entre ta source et le GroupeBy c'est le remplacement de tes valeurs texte avec texte ="null" en valeurs null.

Si tu ne l'as pas fait, les fonctions Table.FillUp et Table.FillDown vont considérer tes cellules qui contiennent "null" comme remplies et non comme des cellules qui contiennent du vide.

@+

Hello Baroute !

Le texte "null" n'existe pas dans mon fichier, je n'avais indiqué cela dans mon exemple (sur mon message original) que pour montrer que les cellules sont vides. Je te confirme que les "null" de mon tableau final contient bien des valeurs null, et non pas du texte indiquant "null".

Si tu veux bien, et je t'en serai très reconnaissant, voici un autre tableau d'exemple où cette fois je garde les cellules vides au lieu d'y écrire "null" et où j'ajoute plus de données typiques de ma requête finale:

Business UnitTypologieClient
Contact
Date de transaction
Prestataire
Statut
ID
Industrie
Machin
Albert X
01/02/2020

Rouge Inc

Commandé
1
AAA
Industrie
Machin
Jean A
04/12/2021
Bleu SAS
Terminé
2

Industrie
Machin
Albert X
23/07/2021

Vert & Cie

En cours
3
CCC
Service
Bidule

18/12/2021
Jaune & Sons

Terminé

4

Industrie
Machin
Albert X
04/03/2021
Rouge Inc
Terminé
5

Agriculture
Chose
Pablo C
23/07/2021
Vert & Cie
Commandé

6

CCC
Service
Bidule
Linda Z
23/09/2021
Vert & Cie
En cours
7

Service
Bidule
Linda Z
20/07/2021
Rouge Inc
En attente
8

Industrie
Truc
Boris P
12/08/2020
Jaune & Sons
Abandonné

9


Industrie
Truc

11/02/2021
Bleu SAS
Abandonné
10

Industrie
Truc
Boris P
18/05/2022
Jaune & Sons
En cours
11

Agriculture
Chose
Pablo C
10/04/2023
Bleu SAS
Terminé
12

Voici le résultat attendu:

Business UnitTypologie
Client
Contact
Date de transaction
Prestataire
Statut
ID

AAA

Industrie
Machin
Albert X
01/02/2020

Rouge Inc

Commandé
1
AAA
Industrie
Machin
Jean A
04/12/2021
Bleu SAS
Terminé
2
AAAIndustrie
Machin
Albert X
23/07/2021

Vert & Cie

En cours
3
CCC
Service
Bidule

18/12/2021
Jaune & Sons

Terminé

4
AAAIndustrie
Machin
Albert X
04/03/2021
Rouge Inc
Terminé
5

Agriculture
Chose
Pablo C
23/07/2021
Vert & Cie
Commandé

6

CCC
Service
Bidule
Linda Z
23/09/2021
Vert & Cie
En cours
7
CCCService
Bidule
Linda Z
20/07/2021
Rouge Inc
En attente
8

Industrie
Truc
Boris P
12/08/2020
Jaune & Sons
Abandonné

9


Industrie
Truc

11/02/2021
Bleu SAS
Abandonné
10

Industrie
Truc
Boris P
18/05/2022
Jaune & Sons
En cours
11

Agriculture
Chose
Pablo C
10/04/2023
Bleu SAS
Terminé
12

Ce qui, sur PowerQuery, donne ceci:

screenshot 0

J'ai essayé d'appliquer la formule suivante selon ton modèle:

= Table.Group(#"Changed Type", {"Typologie", "Client", "Contact", "Date de transaction", "Prestataire", "Statut", "ID"}, {{"Business Unit", each Table.FillDown(Table.FillUp(_,{"Business Unit"}),{"Business Unit"}) }})

screenshot 1

Mais lorsque je développe ma table "Business Unit" pour n'afficher que la colonne "Business Unit", voici ce que cela donne (je l'ai remplacée au début):

screenshot 2
Qu'est-ce que je fais de travers ? :(

En te remerciant encore pour ton aide !

EUREKA ! Et désolé pour le double message. Mon erreur résidait dans le fait que je sélectionne toute ma table pour faire le "Group By". Je n'aurais dû sélectionner que ma colonne "Client". Au final, ma formule aurait dû ressembler à cela:

= Table.Group(#"Changed Type", {"Client"}, {{"Business Unit", each Table.FillDown(Table.FillUp(_,{"Business Unit"}),{"Business Unit"}) }})

Ensuite, il faudra développer la table "Business Unit" en sélectionnant tous les éléments.

@Baroute78, merci pour ton aide et tes lumières ! tu m'as ôté une grande épine du pied :D

Excelliens - 1

ChatGPT - 0

Hello,

Un grand merci pour ce retour qui fait plaisir

N'hésite pas à passer le sujet en résolu

@+

Rechercher des sujets similaires à "powerquery completer colonne deduction"