Страницы: 1
RSS
Power Query. Преобразование сводной таблицы в сжатой форме в плоскую таблицу.
 
Добрый день, уважаемые знатоки.
Прошу дать совет.
Возможно ли средствами Power Query преобразовать сводную таблицу, ВНИМАНИЕ!!!!, В СЖАТОЙ ФОРМЕ (не путать со сводной в формате таблицы) в формат массива данных.
Или только предварительно обрабатывая макросом?
 
Вопрос не понятен от слова совсем. Вы можете на примере в файле пояснить, что вы хотите сделать со сводной таблицей в сжатой форме при помощи PQ?
Вот горшок пустой, он предмет простой...
 
К примеру вот.
Если сводную сохранить как значение, в случае если она построена как табличная форма, то средствами PQ я смогу преобразовать её в массив данных и снова построить сводную. Как сделать через PQ то же самое если сводная построена в сжатой форме, я не знаю.
 
В принципе можно, но тогда заранее нужно знать полную структуру сводной, например, есть ли в ней промежуточные итоги для одного из уровней для всех уровней?  промежуточные итоги отображаются сверху или снизу? Есть ли числовые данные среди измерений сводной в строках? И вот это вот все. Для каждого из случаев будет разный алгоритм обработки.
Вот горшок пустой, он предмет простой...
 
Ну к примеру как во вложении.
Слов "Итог" нет. Это было бы просто.
Вообще не представляю как это сделать
Все усложняется тем что разные по сути группы, находятся в одном столбце
Изменено: babulia - 25.10.2019 16:15:18
 
Наконец-то нашел время. Конкретно такой вид сводной можно разобрать по уровням иерархии вот таким кодом:
Код
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. Преобразование сводной таблицы в сжатой форме в плоскую таблицу.
Изменено: PooHkrd - 07.11.2019 09:58:53
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх