Страницы: 1
RSS
Разворачивание нескольких полей вложенной таблицы PQ
 
Здравствуйте! При использовании PQ регулярно встает задача развернуть вложенную таблицу. Когда нужно вытащить одно поле - вопросов нет. А когда их много, приходится дублировать шаги, что иногда приводит к путанице и всегда к увеличению времени выполнения запроса. Задал вопрос ИИ по составлению функции, которая на входе примет имя поля с вложенной таблицей и список полей этой вложенной таблицы, которые нужно развернуть, создать одноименные поля в результирующей таблице и в этих полях объединить значения через указанный разделитель. Получил такой код функции:
Код
let
    // Определяем функцию
    CombineNestedFields = (InputTable as table, NestedColumnName as text, FieldNames as list) as table =>
    let
        // Разворачиваем вложенную таблицу
        ExpandedTable = Table.ExpandTableColumn(InputTable, NestedColumnName, FieldNames),
        
        // Объединяем строки из каждого указанного поля
        CombinedColumns = List.Transform(FieldNames, (fieldName) =>
            Table.AddColumn(ExpandedTable, "Combined_" & fieldName, each Text.Combine(Record.FieldValues(_, fieldName), ", "), type text)
        ),
        
        // Убираем дубликаты и оставляем только нужные столбцы
        FinalTable = List.Accumulate(CombinedColumns, InputTable, (state, current) => Table.RemoveColumns(state, FieldNames))
    in
        FinalTable
in
    CombineNestedFields
Код применения функции
Код
let
    Source = ... , // ваш источник данных
    Result = CombineNestedFields(Source, "Табл", {"Поле1", "Поле2"}) // замените на имя вашего столбца с вложенной таблицей и нужные поля
in
    Result

Но при использовании возникает ошибка, что "Поле1" не существует.
Прошу помощи в корректировке функции и ее применения. Спасибо.
 
Сработала функция (выкладываю, может, кому-то пригодится).
Код
let
    MergeNestedTableFields = (table as table, nestedTableField as text, fieldNames as list, optional delimiter as nullable text) as table =>
    let
        // Если delimiter не передан, использовать разрыв строки
        delimiterValue = if delimiter = null then "#(lf)" else delimiter,
        
        // Функция для приведения поля к тексту, если оно не является текстом
        ConvertToText = (value) =>
            if Value.Is(value, type text) then value else Text.From(value),
        
        // Добавление объединенных полей
        AddMergedColumns = List.Accumulate(fieldNames, table, (currentTable, fieldName) =>
            Table.AddColumn(
                currentTable,
                fieldName,
                each Text.Combine(List.Transform(Table.Column(Record.Field(_, nestedTableField), fieldName), ConvertToText), delimiterValue),
                type text
            )
        )
    in
        AddMergedColumns
in
    MergeNestedTableFields
Страницы: 1
Читают тему
Наверх