Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Be one of the first to start using Fabric Databases. View on-demand sessions with database experts and the Microsoft product team to learn just how easy it is to get started. Watch now

Reply
Ilovechocolate
New Member

Complex Pivot Column

Hello Everyone,

 

I've been looking for a few days now how to perform the following transformation from Table1 to Table2 but it seems awfully specific and i even have trouble explaining with words what i really want so i'll just expose the table I get and the table i try to get:

 

Table1:

InstanceIDTaskNamestartDate_taskendDate_task
biduleA01/06/2302/06/23
biduleB04/06/2306/06/23
biduleC08/06/2315/06/23
chouetteA06/06/2307/06/23
chouetteB11/06/2312/06/23
chouetteC13/06/2318/06/23
chouetteD23/06/2324/06/23
machinA01/06/2302/06/23
machinB01/06/2303/06/23
machinB04/06/2306/06/23

 

table2:

 

instanceIDstardDate_task_AendDate_task_AstardDate_task_BendDate_task_BstardDate_task_CendDate_task_CstardDate_task_DendDate_task_D
bidule01/06/2302/06/2304/06/2306/06/2308/06/2315/06/23  
chouette06/06/2307/06/2311/06/2312/06/2313/06/2318/06/2323/06/2324/06/23
machin01/06/2302/06/2304/06/2306/06/23    

 

For instanceID "machin" I want only the latest task to be selected but I figured that I should prior to pivot the columns deduplicate these repeated task by choosing the latest one but this is an other problem i have not investigated yet.

 

The endgame for doing this transformation is to be able to calculate easily duration between any tasks as it is the KPIs i try to get in my final report. As i write this post, I wonder now if in terms of performance it would be better to keep table1 and try to get the KPIs wanted with DAX, if you have an opinion on this I would gladly hear it also 🙂

 

Thank you in advance for every bit of help you will give me

 

Best regards

1 ACCEPTED SOLUTION
slorin
Super User
Super User

Bonjour @Ilovechocolate 

Je vais répondre en français, "bidule", "machin" "chouette" 🙂

Même réponse qu'hier (https://community.fabric.microsoft.com/t5/Power-Query/Transform-data-with-Pivot-function-for-multipl...) sauf le "max" à la fin

C'est un classique dépivot, fusion de colonne, pivot (dans le pivot, il faut aller dans les options avancées et choisir "max" pour obtenir la dernière occurrence)

J

let
Source = VotreSource,
Unpivot = Table.Unpivot(Source, {"startDate_task", "endDate_task"}, "Attribut", "Valeur"),
CombineColumns = Table.CombineColumns(Unpivot,{"Attribut", "TaskName"},Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),"Task"),
Pivot = Table.Pivot(CombineColumns, List.Distinct(CombineColumns[Task]), "Task", "Valeur", List.Max)
in
Pivot

Voilà pour la première partie de la question. 

Pour le reste, il faudrait plus de détail pour le calcul de l'écart entre tâche (écart en jour calendaire, en jour ouvré).

 

Stéphane

View solution in original post

6 REPLIES 6
slorin
Super User
Super User

M ou DAX  : ça dépend, du besoin, de la volumétrie, du temps de calcul (à l'actualisation ou à la volée), ...

je travaille beaucoup sur Excel, je maitrise mieux le M que DAX, j'ai donc tendance à le faire en M.

Mais dans Power BI, je teste différentes solutions et j'utilise M/DAX suivant l'efficacité de chacun.

Stéphane

Ok merci pour ces réponses Stéphane, bonne journée!

Ilovechocolate
New Member

Bonjour Stéphane,

 

Merci beaucoup pour la méthodo c'est beaucoup plus clair, j'étais loin de trouver la solution! Du coup, en règle général je comprends que en première étape il faut tout détailler en "lignes" les attributs que je voudrais ensuite voir en colonnes. Ensuite je fusionne les attributs avec la colonne "clé" que je veux pivoter et enfin je pivote cette colonne concaténée et les valeurs dans cette colonne deviennent mes en-têtes de colonnes.

 

Pour la deuxième partie j'étais plus sur un écart en jours calendaires donc très simple à faire, mais j'ai choisi ça parce que je ne savais pas que on pouvait faire en jour ouvré, je suppose qu'il me faut une autre requête avec le calendrier français et ses jours fériés?

 

Cordialement,

 

Cordialement,

Merci pour le retour

pour les écarts, on peut tout faire (en calendaire ou en jours ouvrés - avec en effet une table des jours fériés du pays concerné).

il faut aussi savoir comment faire l'écart entre 2 tâches  : sont-elles triées dans la source ? je suppose qu'elles ne s'appellent pas réellement A, B, C

 

Sinon, sur le fond, je trouve qu'il est préréfable de travailler avec la base initiale et de ne pas pivoter les colonnes pour calculer les écarts (en travaillant par regroupement pour prendre le max de la tâche B sur l'instance "machin")

 

Stéphane

 

 

Ok je vois, du coup tu partirais plutôt sur du DAX pour traiter ce genre de table ? Ou en règle général tu essayes de toucher le moins possibles aux tables dans PowerQuery? C'est une question que je me pose régulièrement, comme je ne travaille pas sur des énormes datasets je ne vois pas trop d'écart de performance pour l'instant entre faire beaucoup de pré-traitement dans PowerQuery et construire des mesures en DAX.

 

Pour ce qui est des écarts effectivement, les tâches ne sont pas dans l'ordre, mais je cherche des durées entre des tâches précises donc je vais par exemple créer une colonne "durée activité 1" qui correspond à la différence entre la fin de la tâche A et au début de la tâche C ce qui sera assez aisé avec le tableau pivoté

 

slorin
Super User
Super User

Bonjour @Ilovechocolate 

Je vais répondre en français, "bidule", "machin" "chouette" 🙂

Même réponse qu'hier (https://community.fabric.microsoft.com/t5/Power-Query/Transform-data-with-Pivot-function-for-multipl...) sauf le "max" à la fin

C'est un classique dépivot, fusion de colonne, pivot (dans le pivot, il faut aller dans les options avancées et choisir "max" pour obtenir la dernière occurrence)

J

let
Source = VotreSource,
Unpivot = Table.Unpivot(Source, {"startDate_task", "endDate_task"}, "Attribut", "Valeur"),
CombineColumns = Table.CombineColumns(Unpivot,{"Attribut", "TaskName"},Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),"Task"),
Pivot = Table.Pivot(CombineColumns, List.Distinct(CombineColumns[Task]), "Task", "Valeur", List.Max)
in
Pivot

Voilà pour la première partie de la question. 

Pour le reste, il faudrait plus de détail pour le calcul de l'écart entre tâche (écart en jour calendaire, en jour ouvré).

 

Stéphane

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!

Dec Fabric Community Survey

We want your feedback!

Your insights matter. That’s why we created a quick survey to learn about your experience finding answers to technical questions.

ArunFabCon

Microsoft Fabric Community Conference 2025

Arun Ulag shares exciting details about the Microsoft Fabric Conference 2025, which will be held in Las Vegas, NV.

December 2024

A Year in Review - December 2024

Find out what content was popular in the Fabric community during 2024.