Страницы: 1
RSS
Преобразование многоуровневой таблицы в плоскую с помощью Power Query
 
Добрый день! Коллеги, нужна ваша помощь в решении задачи на PQ. Необходимо преобразовать многоуровневую таблицу в плоскую. Сама таблица расположена в файле-примере на листе "Данные". На листе "Эталон" желаемый результат. Таким образом каждый столбец в исходных данных, начиная с 3го будет разделен на 3 столбца. В запросе "1 столбец" я добился желаемого результата, но только для 1 столбца.

В теории придумал такое решение: можно на основе этого запроса сделать пользовательскую функцию, которую в дальнейшем можно применить к каждому столбцу начиная с 3. Затем объединить полученные с помощью функции таблицы с помощью Table.Combine. Все это должно выполняться внутри Table.Group например, чтобы при разворачивании таблиц остались 2 первых столбца из исходной. Ну это все теория, а как подобное сделать на практике я не совсем понимаю. Возможно есть более правильное решение.
 
Добрый день
Код
let
    source     = Excel.Workbook(File.Contents(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content]{0}[source]), null, true){[Item="Данные",Kind="Sheet"]}[Data],
    HeaderRows = 2,
    Headers    = Table.ToRows(Table.TransformColumns(Table.Transpose(Table.FirstN(source,HeaderRows)),List.Zip({List.Transform({1..HeaderRows},each "Column"&Text.From(_)),List.Repeat({each Text.From(_)},HeaderRows)}))),
    NewHeaders = List.Generate(
                    ()=> [
                        i = 0,
                        r = List.RemoveLastN(Headers{i},each _=null),
                        v = r
                    ],
                    each [i]<List.Count(Headers),
                    each [  
                        i = [i]+1,
                        r = List.RemoveLastN(Headers{i},each _=null),
                        v = let 
                                prev=[v] 
                            in 
                                List.Generate(
                                    ()=> [
                                        i=0,
                                        s=if r{i}=null then prev{i} else r{i}
                                    ], 
                                    each [i]<List.Count(r),
                                    each [
                                        i=[i]+1,
                                        s=if r{i}=null then prev{i} else r{i}
                                    ], 
                                    each [s]
                                )
                    ],
                    each Text.Combine([v],"|")
                 ),
    AddHeaders = Table.PromoteHeaders(Table.InsertRows(Table.Skip(source,2),0,{Record.FromList(NewHeaders,Table.ColumnNames(source))})),
    FilledDown = Table.FillDown(AddHeaders,{"шт."}),
    Filtered   = Table.SelectRows(FilledDown, each ([Выпито] <> "Всего")),
    Unpivot    = Table.UnpivotOtherColumns(Filtered, {"шт.", "Выпито"}, "Атрибут", "Значение"),
    Split      = Table.SplitColumn(Unpivot, "Атрибут", each Text.Split(_,"|"), {"Атрибут","Дата"}),
    Typed      = Table.TransformColumnTypes(Split,{{"Дата", type date}})
in
    Typed
 
Андрей Лящук, большое спасибо! Нереально сложно для меня)
Страницы: 1
Наверх