Divisions euclidiennes successives en powerquery

Bonjour,

Je cherche un moyen sur powerquery pour diviser une quantité (ici 1150) successivement par plusieurs facteurs en commençant par les plus élevés. Voici une capture du fichier excel que j'ai mis en PJ (EDIT : fichier mis à jour)

20projet.xlsx (20.39 Ko)
image

La formule ferait ce calcul avec autant de division euclidiennes qu'il y a de doses de médicament (ici 2 à 1000mg et 120mg)

Division euclidienne 1 --> 1150/1000=1 + reste de 150

Division euclidienne 2 --> 150/120=1 + reste de 30

Voici le résultat que je souhaiterai obtenir. Est ce possible avec SUMX ?

MédicamentDose nécessaireDoseUnitéQtéReste
PlaceboDX11501000mg1150
PlaceboDX1150120mg130

Bonjour à tous !

Vos données, notamment Feuil2, ne sont pas accessibles....

Ne pas confondre le langage DAX (SUMX) avec le langage M de Power Query.

Concernant votre besoin, vous devriez voir du côté de la fonction Number.Mod.

Merci je l'ai mis à jour pour qu'il soit accessible à lui même. Il faudrait que je réussisse à décrémenter la dose nécessaire de Number.Mod([Dose nécessaire]][Dose])

Bonsoir à tous

Je vous propose de modifier votre Feuil1 comme suit :

let
    Filepath = Excel.CurrentWorkbook(){[Name="Filepath"]}[Content]{0}[Column1],
    Source = Excel.Workbook(File.Contents(Filepath&"Projet.xlsx"), null, true),
    Feuil1_Sheet = Source{[Item="Feuil1",Kind="Sheet"]}[Data],
    #"En-têtes promus" = Table.PromoteHeaders(Feuil1_Sheet),
    #"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"Médicament", type text}, {"Dose nécessaire", Int64.Type}}),
    #"Requêtes fusionnées" = Table.NestedJoin(#"Type modifié",{"Médicament"},Feuil2,{"Médicament"},"Fusion"),
    DivisionsSuccessives = Table.AddColumn(#"Requêtes fusionnées", "Résultat", each List.Accumulate(List.Sort([Fusion][Dose],1),[Dose nécessaire],(a,c) => Number.Mod(a,c)))
in
    DivisionsSuccessives

Merci beaucoup, c'est la formule idéale. J'aimerais qu'elle tourne sur toutes les doses et j'ai donc ajouté une fusion intermédiaire "1èreFusion". Je dois alors modifier le List.Sort afin qu'y soit filtré Dose (2ème Fusion) >= Dose (Feuil1 venant de 1èreFusion)

Je ne sais pas où et comment mettre cette condition :

- En modifiant le List.Sort([2ème Fusion][Dose],1) ?
- J'ai essayé dans la formule de la 2èmeFusion mais le champ Dose de la Feuil1 n'arrive pas à être appelé, même en le renommant au préalable en Dosebis : Table.NestedJoin(#"Colonnes renommées",{"Médicament"},Table.SelectRows(Feuil2, each [Dose] >= [Dosebis]),{"Médicament"},"NewColumn.1")

J'imagine que dans les 2 cas le problème est le même, la Table fusionnée doit être filtrée par un critère extérieur, venant de la ligne où est faite la fusion.

Pour illustrer le problème, j'aimerais sur la capture que le détail de la Table en vert ne prenne pas la 2ème ligne car 120 (Dose 2èmeFusion) < 1000 (Dose 1èreFusion), et que le calcul s'arrête alors au Number.Mod(1150,1000) afin de donner 150 au lieu de 30.

11projet.xlsx (23.57 Ko)
image

Bonjour à tous !

Vos précisions me sont totalement obscures.

La méthode de calcul initialement prévue est modifiée ?

Si la table rapatriée comporte 3 doses, vous allez rajouter une troisième fusion ? Et si n doses ? n fusions ???

Difficile de vous accompagner sans compréhension du calcul et du besoin.

J'essaie d'illustrer mon problème,

Voici ce que vous m'avez proposé, la formule de division successive par List.Accumulate et Number.mod se fait sur la table en gras de la Fusion1 non développé

image

Ce que je souhaiterais faire est de développer la première fusion puis d'en refaire une mais avec la condition que seulement les Doses >= à celle de la ligne serait en fusion. Votre formule resterait identique mais s'appliquerait à la Table en gras d'où partent les flèches bleues.

image

En repartant du premier fichier que j'ai joint, j'ai remplacé la Feuil1 par votre proposition initiale en la modifiant, c'est la fusion en gras que j'aimerais modifier

Let
Filepath = Excel.CurrentWorkbook(){[Name="Filepath"]}[Content]{0}[Column1],
Source = Excel.Workbook(File.Contents(Filepath&"Projet.xlsx"), null, true),
Feuil1_Sheet = Source{[Item="Feuil1",Kind="Sheet"]}[Data],
#"En-têtes promus" = Table.PromoteHeaders(Feuil1_Sheet),
#"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"Médicament", type text}, {"Dose nécessaire", Int64.Type}}),
#"Requêtes fusionnées" = Table.NestedJoin(#"Type modifié",{"Médicament"},Feuil2,{"Médicament"},"Fusion"),
#"Fusion développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Fusion", {"Médicament", "Dose", "Unité"}, {"Médicament.1", "Dose", "Unité"}),
#"Requêtes fusionnées1" = Table.NestedJoin(#"Fusion développé", {"Médicament"}, Feuil2, {"Médicament"}, "Feuil2", JoinKind.LeftOuter),
DivisionsSuccessives = Table.AddColumn(#"Requêtes fusionnées1", "Résultat", each List.Accumulate(List.Sort([Feuil2][Dose],1),[Dose nécessaire],(a,c) => Number.Mod(a,c)))
in
DivisionsSuccessives

Bonjour à tous !

Une proposition ?

Note : Mettre à jour le chemin et le nom du classeur avant l'actualisation

EDIT : Classeur amendé !

Merci beaucoup JFL c'est exactement ça. Excellente année à vous !

Bonjour à tous !

Bien !

Je vous remercie de ce retour.

Rechercher des sujets similaires à "divisions euclidiennes successives powerquery"