Récupérer le nombre de lignes par occurrence

Accueil – Le CFO masqué Forums Power Query Récupérer le nombre de lignes par occurrence

  • Ce sujet contient 5 réponses, 2 participants et a été mis à jour pour la dernière fois par thomas.tesson.pro, le il y a 4 années et 6 mois.
6 sujets de 1 à 6 (sur un total de 6)
  • Auteur
    Articles
  • #58572
    thomas.tesson.pro
    Participant

    Bonjour à toutes et tous !
    J’ai un petit soucis sur un fichier.
    J’ai comme colonne un code produit, un conditionnement et un prix (qui varie selon le conditionnement), j’aimerai ajouter une colonne qui contient un chiffre allant de 1 à X (sachant que X correspond au nombre d’occurrence pour le code produit UNIQUEMENT).
    Pour donner une autre vision de la chose :
    CODE PROD | CONDITMT | PRIX |
    000001 | 1| 20.00 |
    000001 | 10| 18.00 |
    000001 | 100| 15.00 |
    000002 | 1| 25.00 |

    A ce tableau j’aimerai donc ajouter “1” pour la première ligne, “2” à la seconde, “3” pour la troisième puis “1” à la quatrième, etc… une sorte de compteur en fonction du code produit.

    J’ai trouvé un sujet pour l’équivalence de “NB.SI” en query (https://www.lecfomasque.com/sujet/equivalent-de-nb-si-sur-powerquery/), ce qui me semblait super intéressant car je gardais la colonne code produit et je pouvais récupérer le nombre d’occurrence :
    CODE PROD | NOMBRE |
    000001 | 1|
    000001 | 2|
    000001 | 3|
    000002 | 1|

    À ce résultat j’aimerai ajouter le restant de mes colonnes, cependant quand je fusionne les requêtes je me retrouve avec un colonne avec des données table, je récupère ensuite les colonnes qui m’intéressent et là mauvaise surprise…

    CODE PROD | NOMBRE | CONDITMT | PRIX |
    000001 | 1| 1| 20.00 |
    000001 | 1| 10| 18.00 |
    000001 | 1| 100| 15.00 |
    000001 | 2| 1| 20.00 |
    000001 | 2| 10| 18.00 |
    000001 | 2| 100| 15.00 |
    000001 | 3| 1| 20.00 |
    000001 | 3| 10| 18.00 |
    000001 | 3| 100| 15.00 |
    000002 | 1| 1| 25.00 |

    Sauriez vous comment je peux récupérer un tableau sous la forme :

    CODE PROD | NOMBRE | CONDITMT | PRIX |
    000001 | 1| 1| 20.00 |
    000001 | 2| 10| 18.00 |
    000001 | 3| 100| 15.00 |
    000002 | 1| 1| 25.00 |

    En espérant que mon explication soit claire !
    Merci par avance pour votre retour 🙂

    #58574
    Stéphane Lorin
    Participant

    Bonjour

    Il faut dans un premier temps ajouter un index à votre table (à partir de 1 ou de 0 – j’ai choisi ici 1)

    CODE PROD | CONDITMT | PRIX | Index
    000001 | 1| 20.00 | 1
    000001 | 10| 18.00 | 2
    000001 | 100| 15.00 | 3
    000002 | 1| 25.00 | 4

    Puis faire référence à cette table en regroupant par CODE PROD et en retenant le “min” de Index
    CODE PROD | MinIndex
    000001 |1
    000002 |4

    Puis fusionner les deux tables sur le CODE PROD

    CODE PROD | CONDITMT | PRIX | Index |MinIndex
    000001 | 1| 20.00 | 1 | 1
    000001 | 10| 18.00 | 2 | 1
    000001 | 100| 15.00 | 3 | 1
    000002 | 1| 25.00 | 4| 4

    et enfin faire la différence entre Index et MinIndex + 1

    CODE PROD | CONDITMT | PRIX | Index |MinIndex | Différence
    000001 | 1| 20.00 | 1 | 1 | 1
    000001 | 10| 18.00 | 2 | 1 | 2
    000001 | 100| 15.00 | 3 | 1 | 3
    000002 | 1| 25.00 | 4| 4 | 1

    Cordialement

    Stéphane

    #58575
    Stéphane Lorin
    Participant

    Précision : il faut que les “CODE PROD” soient triés pour que les mêmes n° soient les uns avec les autres et non mélangés
    Stéphane

    #58576
    thomas.tesson.pro
    Participant

    Bonjour Stéphane et merci de votre retour !
    Je n’ai qu’un mot à dire… MERCI !
    ça marche du feu de Dieux !

    #58577
    Stéphane Lorin
    Participant

    Re-bonjour
    En complément, voici une solution si votre colonne de code n’est pas triée :

    Table intermédiaire avec la liste de n° de lignes de chaque code
    – ajouter un Index à la table initiale
    – regrouper les lignes par code en choisissant toutes les lignes et en modifiant la formule : “each _, type table” par “each _[Index], type list” pour récupérer la liste des lignes de chaque code et non une table avec toutes les lignes de chacun

    Reprendre votre table initiale
    – ajouter le même Index
    – fusionner avec la table intermédiaire par code et récupérer la liste des lignes de chacun
    – ajouter une colonne avec la fonction “List.PositionOf” qui permet de récupérer la position de la ligne actuelle dans l’ensemble des lignes du code et ajouter 1 pour ne pas commencer de 0 la 1ère occurrence.

    Je contrôle que j’obtiens le même résultat qu’avec une formule NB.SI partant du l’en-tête jusqu’à la ligne actuelle : =NB.SI(Liste_Code[[#En-têtes];[Code]]:[@Code];[@Code])

    il aurait été plus simple de sauvegarder l’ordre initial des lignes avec un Index, de trier les codes, d’exécuter ma première méthode, et de remettre l’ordre initial, mais bon… c’était pour le plaisir de trouver une autre solution un peu plus complexe !

    Voir un exemple ci-joint

    Stéphane

    Attachments:
    You must be logged in to view attached files.
    #58644
    thomas.tesson.pro
    Participant

    Bonjour Stéphane

    Merci pour votre second retour !
    La première méthode donnée fonctionne parfaitement ! La seconde également bien sûr !

6 sujets de 1 à 6 (sur un total de 6)
  • Vous devez être connecté pour répondre à ce sujet.