Страницы: 1
RSS
Power query. Формирование промежуточных итоговых строк в исходной таблице
 
здравствуйте!
столкнулся с неожиданной проблемой - использую в одном решении Table.InsertRows.
Во вложении пример файла как я сделал, прописав вручную параметр строки для вставки.
Таким параметром является описание полей таблицы. Они совпадают с названиями столбцов, в общем тут все понятно.
Всё хорошо. всё работает.
Только если таких столбцов десятки, то вручную прописывать их становиться тяжело.
Начал пробовать разные способы задания параметра строки и вдруг понял, что ничего не понял что не могу сообразить как это сделать вообще.
Ну создал список заголовков столбцов. А как его запихнуть в тело функции?
Код
Table.InsertRows(_,0, {_})}), где {_} - типа {List.Sum[столбец1],List.Sum[столбец2] и т.д.}
при этом столбец1, столбец2 и т.д. автоматически подставляются из списка заголовков столбцов.
Прошу подсказать решение такой задачи. Надеюсь во вложении понятнее изложено.
 
Интересно...
 
игорь сергеев, как ответить на ваш вопрос не знаю.
Но есть альтернатива вашему решению:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    АвтоТип = Table.TransformColumnTypes(Источник,{{"Name", type text}, {"Mth", type text}, {"Count", Int64.Type}, {"Amount", Int64.Type}}),
    Группировка = Table.Group(АвтоТип, {"Name", "Mth"}, {{"Count", each List.Sum([Count]), type number}, {"Amount", each List.Sum([Amount]), type number}, {"All", each _, type table}}),
    Объединяем = Table.CombineColumns(Группировка,{"Name", "Mth"},Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),"Name"),
    Префикс = Table.TransformColumns(Объединяем, {{"Name", each "Итоги: " & _, type text}}),
    ТабличкиСИтогами = Table.AddColumn(Префикс, "ТаблицаСИтогами", each Table.FromColumns({{[Name]}, {null}, {[Count]}, {[Amount]}}, Table.ColumnNames(Источник)), type table),
    ОбъединяемИтогиСИсходником = Table.SelectColumns(Table.AddColumn(ТабличкиСИтогами, "Итог", each [ТаблицаСИтогами] & [All]),{"Итог"}),
    Результат = Table.ExpandTableColumn(ОбъединяемИтогиСИсходником, "Итог", {"Name", "Mth", "Count", "Amount"}, {"Name", "Mth", "Count", "Amount"})
in
    Результат

Такой подход решает вашу проблему?
Вот горшок пустой, он предмет простой...
 
Спасибо, посмотрю.
С наскока ответить не смогу - тут задача какая: заранее неизвестно количество столбцов по которым надо иметь итоги (часть, например, текстовые, часть не требует расчета). Количество же столбцов общее - большое. Хочу уйти от ручного прописывания наименований столбцов, (в принципе рассматриваю даже вариант чтобы суммировало все столбцы (включая текстовые). потом проще error'ы поубирать.)
Такое длинное вступление ) в ответ на ваш вопрос: буду смотреть ваш вариант на предмет - получиться, не получиться задать столбцы списком.
Может у вас будут идеи тоже. как в этот вариант задать наименования столбцов списком?
Спасибо за вариант.
 
Доброе время суток.
Как-то так. Только я не через Table.InsertRows делал, да простят меня модераторы ;)
Изменено: Андрей VG - 02.11.2018 13:12:54 (Поправил - развётка то столбцов табличного столбца была не динамической)
 
Цитата
игорь сергеев написал:
Может у вас будут идеи тоже. как в этот вариант задать наименования столбцов списком?
В коде задание столбцов списком представлено формулой
Код
Table.ColumnNames(Источник)

В коде от Андрея, как всегда, оригинальное решение задачи именно в общем виде.  8)
Андрей VG, по хорошему завидую вашему видению вариантов решения задачи, все таки не хватает мне такого глубокого знания языка.
игорь сергеев, вообще по правилам мы вам должны были накидывать решения именно при помощи Table.InsertRows, но так как это не свосем оптимально, то предлагаю более общее название темы: Power query. Объединение итоговых строк с исходной таблицей.
Ну или ТС может предложит свое, по-лучше.
Изменено: PooHkrd - 02.11.2018 13:19:58
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
но так как это не свосем оптимально
В принципе можно и через него - тут особой разницы нет, на мой взгляд. Чуть переписал - что-то перемудрил вначале - спешка - она до добра не доводит.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    Typed = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Mth", type text}, {"text col", type text}, {"Count", Int64.Type}, {"Amount", Int64.Type}}),
    colNames = Table.ColumnNames(Typed),
    schema = Table.Schema(Typed)[[Name], [Kind]],
    groupNames = List.Range(colNames, 0, 2),
    statNames = List.Range(colNames, 2),
    maker = Table.Group(Typed, groupNames, {"temp", (sub) =>
    let
        first = Record.FieldValues(sub{0}),
        start =  {"Итого: " & Text.From(first{0}) & " " & Text.From(first{1}), null},
        others = List.Transform(statNames, each if schema{[Name=_]}[Kind] = "number" then List.Sum(Table.Column(sub, _)) else null)
    in
        Table.InsertRows(sub, 0, {Record.FromList(start & others, colNames)})
    })[[temp]],
    #"Expanded {0}" = Table.ExpandTableColumn(maker, "temp", colNames)

in
    #"Expanded {0}"
 
да. согласен с PooHkrd, название уже не соответствует
Предлагаю поменять название на: Power query. Формирование промежуточных итоговых строк в исходной таблице.
Андрей VG, спасибо. Ваши решения как учебник - изучать и изучать потом. )) Не устаешь удивляться, как говориться...
Спасибо PooHkrd и Андрей VG еще раз большое. И не только за решение конкретной данной задачи, а и за новые знания о PQ.
Страницы: 1
Наверх