Forum Discussion
Combine values from multiple rows
- 1 year ago
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSixOSVPSUTIE4pDM5OzUEhDHyBhI5pXm5MCoWB0UlUGpicX5eQg1SanJiaXFqThUOxelJpakpqAZqaNkZGBkomtoAEQYOnLyi/FpMARrqKisAgoaI7vc1NQUi8sRCtEdXp5RqZCXX4JdMR53G+saGAKRUmwsAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ID = _t, Group = _t, Name = _t, Ticket = _t, Reason = _t, DateTime = _t]), #"Replaced Value" = Table.ReplaceValue(Source,"null",null,Replacer.ReplaceValue,{"Ticket", "Reason", "DateTime"}), trans = (tbl)=> let #"Removed Other Columns" = Table.SelectColumns(Table.AddColumn(tbl, "Value", each List.RemoveNulls({[Ticket],[Reason],[DateTime]}){0}),{"Name", "Value"}) in Table.Pivot(#"Removed Other Columns", List.Distinct(#"Removed Other Columns"[Name]), "Name", "Value"), #"Grouped Rows" = Table.Group(#"Replaced Value", {"ID", "Group"}, {{"Rows", each trans(_), type table [ Ticket=nullable text, Reason=nullable text, Created=nullable text, Closed=nullable text]}}), #"Expanded Rows" = Table.ExpandTableColumn(#"Grouped Rows", "Rows", {"Ticket", "Reason", "Created", "Closed"}, {"Ticket", "Reason", "Created", "Closed"}) in #"Expanded Rows"How to use this code: Create a new Blank Query. Click on "Advanced Editor". Replace the code in the window with the code provided here. Click "Done". Once you examined the code, replace the Source step with your own source.
- 1 year ago
Consider the next data in power query
Select the columns Ticket, Reason, and Date time then right click on one of them and pick unpivot columns to reach next image.
then on the value column filter non null values and also remove column Attribute to reach the next image
now select Name column and from transform tab pick pivot column and make the next setting to solve the problem.
the result would be like the next image
here you can find the whole code
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSixOSVPSUTIE4pDM5OzUEhDHyBhI5pXm5MCoWB0UlUGpicX5eQg1SanJiaXFqThUOxelJpakpqAZqaNkZGBkomtoAEQYOnLyi/FpMARrqKisAgoaI7vc1NQUi8sRCtEdXp5RqZCXX4JdMR53G+saGAKRUmwsAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ID = _t, Group = _t, Name = _t, Ticket = _t, Reason = _t, DateTime = _t]), #"Unpivoted Columns" = Table.UnpivotOtherColumns(Source, {"ID", "Group", "Name"}, "Attribute", "Value"), #"Filtered Rows" = Table.SelectRows(#"Unpivoted Columns", each ([Value] <> "null")), #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Attribute"}), #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Name]), "Name", "Value") in #"Pivoted Column"If this answer helped resolve your issue, please consider marking it as the accepted answer. And if you found my response helpful, I'd appreciate it if you could give me kudos.
Thank you!
- 1 year ago
Looks like my original code produces that result
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSixOSVPSUTIE4pDM5OzUEhDHyBhI5pXm5MCoWB0UlUGpicX5eQg1SanJiaXFqThUOxelJpakpqAZqaNkZGBkomtoAEQKBoZWBgZAhKE1J7+YdJ1GyJ4xNTXF7RkjLJ4pz6hUyMsvwaGaTM8YEeEZI1SdFZVV6BGD3S8IhUR4BaEYj0+MdQ0MgQibe4gIW4RCot1DTsgi6cQZsMYYARsLAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ID = _t, Group = _t, Name = _t, Ticket = _t, Reason = _t, DateTime = _t]), #"Replaced Value" = Table.ReplaceValue(Source,"null",null,Replacer.ReplaceValue,{"Ticket", "Reason", "DateTime"}), trans = (tbl)=> let #"Removed Other Columns" = Table.SelectColumns(Table.AddColumn(tbl, "Value", each List.RemoveNulls({[Ticket],[Reason],[DateTime]}){0}),{"Name", "Value"}) in Table.Pivot(#"Removed Other Columns", List.Distinct(#"Removed Other Columns"[Name]), "Name", "Value"), #"Grouped Rows" = Table.Group(#"Replaced Value", {"ID", "Group"}, {{"Rows", each trans(_), type table [ Ticket=nullable text, Reason=nullable text, Created=nullable text, Closed=nullable text]}}), #"Expanded Rows" = Table.ExpandTableColumn(#"Grouped Rows", "Rows", {"Ticket", "Reason", "Created", "Closed"}, {"Ticket", "Reason", "Created", "Closed"}) in #"Expanded Rows"
Consider the next data in power query
Select the columns Ticket, Reason, and Date time then right click on one of them and pick unpivot columns to reach next image.
then on the value column filter non null values and also remove column Attribute to reach the next image
now select Name column and from transform tab pick pivot column and make the next setting to solve the problem.
the result would be like the next image
here you can find the whole code
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSixOSVPSUTIE4pDM5OzUEhDHyBhI5pXm5MCoWB0UlUGpicX5eQg1SanJiaXFqThUOxelJpakpqAZqaNkZGBkomtoAEQYOnLyi/FpMARrqKisAgoaI7vc1NQUi8sRCtEdXp5RqZCXX4JdMR53G+saGAKRUmwsAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ID = _t, Group = _t, Name = _t, Ticket = _t, Reason = _t, DateTime = _t]),
#"Unpivoted Columns" = Table.UnpivotOtherColumns(Source, {"ID", "Group", "Name"}, "Attribute", "Value"),
#"Filtered Rows" = Table.SelectRows(#"Unpivoted Columns", each ([Value] <> "null")),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Attribute"}),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Name]), "Name", "Value")
in
#"Pivoted Column"
If this answer helped resolve your issue, please consider marking it as the accepted answer. And if you found my response helpful, I'd appreciate it if you could give me kudos.
Thank you!
Thank you, Omid_Motamedise . Although I got a few responses to this question, I chose yours since it allowed me to see what was happening step by step. The only problem I have after I have finished, I received errors for rows where the Id column is not unique. For example:
| ID | Group | Name | Ticket | Reason | DateTime |
| asdf | 1 | Ticket | 123 | null | null |
| asdf | 1 | Reason | null | because | null |
| asdf | 1 | Created | null | null | 2024-10-10 |
| asdf | 1 | Closed | null | null | 2024-10-11 |
| asdf | 2 | Ticket | 555 | null | null |
| asdf | 2 | Reason | null | why not | null |
| asdf | 2 | Created | null | null | 2023-01-01 |
The result seems to only return the results for the first group for ID: asdf.
When I view the error, I get:
Do you know a way around this?
Thanks!
- Omid_Motamedise1 year agoSuper User
Thank you, the error you have shared is about the rows with more than one item for a field. in such condition you can use the last parameters in Table.Pivot function which is now
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Name]), "Name", "Value")
but you can add some aggregation function in the last argument, so rewrite the previous formula as the next by adding the fifth argument to solve this problem
= Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Name]), "Name", "Value", each Text.Combine(_,", "))
- alagator281 year agoHelper II
Thank you Omid_Motamedise . I really appreciate the help. Still not working, so I'll try to explain as well as I can.
First, after the unpivot step, I don't get any null values. So, filtering them doesn't change anything. Thought it might be important to mention. Here is what it looks like after that step:
Once I get to the last step and I make the changes you suggest, I'm now getting errors in Created, Closed and Ticket columns.
The new errors I see everywhere look like it doesn't like that those values are in date format:
I went back and tried it with the DateTime being in text format and I end up with this, which doesn't quite work. I need them showing in the columns.
Here is the final code if it helps:
let Source = Sql.Database("***********", "***************"), dbo_CustomFieldDatas = Source{[Schema="dbo",Item="CustomFieldDatas"]}[Data], #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Reordered Columns", {"ID", "Group", "Name"}, "Attribute", "Value"), #"Filtered Rows" = Table.SelectRows(#"Unpivoted Columns", each ([Value] <> "null")), #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Attribute"}), #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Name]), "Name", "Value", each Text.Combine(_,", ")) in #"Pivoted Column"Any ideas? Thanks again!
- alagator281 year agoHelper II
Thank you Omid_Motamedise . I was able to use this code after finding duplicates in my "Name" column which was causing the issue. Works now.