Let
Source = Excel.CurrentWorkbook(){[Name="Table2
"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Parent Part Number", type text}, {"Child Part Number", type text}, {"Description", type text}, {"Qty", Int64.Type}}),
BOM = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
//This next section find duplicate child parts and then merges index to make them a primary key to then establish the real level and the re-merge into query
#"Grouped Rows" = Table.Group(BOM, {"Child Part Number"}, {{"Count", each Table.RowCount(_), type number}, {"mytable", each _, type table}, {"Min Index", each List.Min([Index]), type number}}),
#"Filtered Rows" = Table.SelectRows(#"Grouped Rows", each [Count] > 1),
#"Expanded mytable" = Table.ExpandTableColumn(#"Filtered Rows", "mytable", {"Index"}, {"Index"}),
#"Added Conditional Column" = Table.AddColumn(#"Expanded mytable", "Custom", each if [Index] = [Min Index] then "Delete" else "Keep"),
#"Filtered Rows1" = Table.SelectRows(#"Added Conditional Column", each ([Custom] = "Keep")),
#"Duplicated Column" = Table.DuplicateColumn(#"Filtered Rows1", "Index", "Index - Copy"),
#"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Duplicated Column", {{"Index - Copy", type text}}, "en-GB"),{"Child Part Number", "Index - Copy"},Combiner.CombineTextByDelimiter("#", QuoteStyle.None),"Merged"),
//Merge duplicate values with original BOM
Custom1 = Table.NestedJoin(#"Merged Columns",{"Index"},BOM,{"Index"},"BOM",JoinKind.RightOuter),
#"Expanded BOM" = Table.ExpandTableColumn(Custom1, "BOM", {"Parent Part Number", "Child Part Number", "Description", "Qty", "Index"}, {"Parent Part Number", "Child Part Number", "Description", "Qty", "Index.1"}),
#"Added Conditional Column1" = Table.AddColumn(#"Expanded BOM", "Custom.1", each if [Merged] <> null then [Merged] else [Child Part Number]),
#"Removed Other Columns" = Table.SelectColumns(#"Added Conditional Column1",{"Parent Part Number", "Description", "Qty", "Index.1", "Custom.1"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Other Columns",{{"Custom.1", "Child Part Number"}, {"Index.1", "Index"}}),
//Establish through lists and parameters the level of the structure
Parent_List=List.Buffer(#"Renamed Columns"[Parent Part Number]),
Child_List=List.Buffer(#"Renamed Columns"[Child Part Number]),
Depth = (child as text, optional level as nullable number) =>
let Parent = Parent_List{ List.PositionOf( Child_List, child )}
in if List.PositionOf( Child_List, Parent ) = -1 then level else @Depth( Parent, level + 1 ),
#"Level"= Table.AddColumn(#"Renamed Columns", "Level", each Depth( [Child Part Number],0), type number),
//Remove Delimter from duplicated child part
#"Extracted Text Before Delimiter" = Table.TransformColumns(Level, {{"Child Part Number", each Text.BeforeDelimiter(_, "#"), type text}}),
#"Reordered Columns" = Table.ReorderColumns(#"Extracted Text Before Delimiter",{"Index", "Level", "Parent Part Number", "Child Part Number", "Description", "Qty"})
in
#"Reordered Columns"