Наконец-то нашел время. Конкретно такой вид сводной можно разобрать по уровням иерархии вот таким кодом:
Код |
---|
let
FnCalcLevels = (sub as table, col as text)=>
let
itemCount = Table.RowCount( sub ),
sumList = List.Buffer( List.Reverse( Table.ToColumns( Table.SelectColumns( sub, {col}) ){0} ) ),
calcRunningTotal = List.Generate(
() => [id = 0, lev = 0, runSum = [0 = sumList{id}, 1 = null, 2 = null, 3 = null, 4 = null]],
each [id] < itemCount,
each [ id = [id] + 1,
lev = if Number.Round( List.Sum({ Record.ToList([runSum]){[lev]}, -sumList{id} }), 8 ) = 0 then [lev] + 1 else 0,
runSum = Record.TransformFields( [runSum], List.Transform({0..lev}, each {Text.From(_), (x)=>List.Sum({ x, sumList{id} }) * Number.From(_=lev) } ) )],
each [lev]
),
result = Table.FromColumns( Table.ToColumns( sub ) & { List.Reverse( calcRunningTotal ) }, Table.ColumnNames( sub ) & {"Level"} )
in
result,
Source = Excel.Workbook(File.Contents("D:\Лист Microsoft Excel.xlsx"), null, true),
Navigation = Source{[Item="Сжатая форма сводной",Kind="Sheet"]}[Data],
RemovedTopRows = Table.Skip(Navigation,1),
PromotedHeaders = Table.PromoteHeaders(RemovedTopRows, [PromoteAllScalars=true]),
FilteredRows = Table.SelectRows(PromotedHeaders, each [Названия строк] <> "Общий итог" ),
Levels = FnCalcLevels( FilteredRows , "1" )
in
Levels |
Не уверен что ТС уже зайдет, но вдруг кому-то будет интересно.
Повторюсь еще раз, это крайне узкоспециализированное решение для именно приведенного в примере вида сводной. Причем годное не на 100%, всякие случайности могут повлиять на корректность распознавания уровней иерархии.
Я то просто с List.Generate потренироваться хотел.
Ну и если у модераторов возникнут вопросы, то предлагаю тему:
Power Query. Преобразование сводной таблицы в сжатой форме в плоскую таблицу.