[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 Unit | Colonne X | Client |
|---|---|---|
| null | Machin | |
| AAA | Machin | |
| null | Machin | |
| null | Truc | |
| null | Truc | |
| null | Bidule | |
| BBB | Bidule | |
| BBB | Bidule | |
| null | Bidule | |
| null | Bidule | |
| BBB | Bidule |
Et voici le résultat attendu:
| Business Unit | Colonne 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 :
Après j'ai enlevé cette partie qui ne sert pas dans ce cas là dans la ligne de code générée :
A partir de là c'est un jeu d'enfant, le "each _" signifie "chaque enregistrement de la sous table"
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
Puis sur cette sous table modifiée, j'effectue le Table.FillDown pour remplir vers le bas
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 Unit | Typologie | Client | 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 Unit | Typologie | 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 |
| AAA | Industrie | Machin | Albert X | 23/07/2021 | Vert & Cie | En cours | 3 |
| CCC | Service | Bidule | 18/12/2021 | Jaune & Sons | Terminé | 4 | |
| AAA | 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 |
| CCC | 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 |
Ce qui, sur PowerQuery, donne ceci:
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"}) }})
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):
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
@+