Мне нужно сделать динамическую агрегацию в Power Query, суммируя или объединяя повторяющиеся значения в моих таблицах

Вот пример моих данных:

Образец Метод А Метод Б Метод С Метод Г Метод Е ПАРТИЯ Nu Лабораторные данные Образец 1 1 2 8 TX_0001 LAB1 Образец 1 5 9 TX_0002 LAB2 Образец 2 7 8 8 23 TX_0001 LAB1 Образец 2 41 TX_0001 LAB2 Образец 3 11 55 ТХ_0394 LAB2 Образец 4 2 9 5 9 ТХ_0394 LAB1

Мне нужно сделать код M Language, который их объединяет, на основе дублированных образцов. Обратите внимание, что они могут быть в одной партии и/или в одной лаборатории, но они никогда не будут изготавливаться одним и тем же методом дважды.

Поэтому я не могу передать имена столбцов, потому что они постоянно меняются, и я хотел сделать это, динамически передавая имена столбцов.

**OBS: У меня есть возможность сделать связанную таблицу исходного кода с Microsoft Access и сделать это с помощью SQL, но я не смог найти функцию агрегации текста в библиотеке MS Access. Там это возможно для каждого имени столбца без проблем. (Просто дело в том, что в моей компании больше никто не знает M Language, и я не могу допустить, чтобы это было неавтоматизировано) **

Это то, что я пытался улучшить, но у меня есть некоторые ошибки: 1. Оба столбца с группировкой имеют «Ошибки» во всех ячейках. 2. Недостаточно памяти для оценки

Я не могу обнаружить, что я делаю неправильно здесь.

let
    Source = ALS,
    schema = Table.Schema(Source),
    columns = schema[Name],
    types = schema[Kind],
    Table = Table.FromColumns({columns,types}),
    Number_Columns = Table.SelectRows(Table, each ([Column2] = "number")),
    Other_Columns = Table.SelectRows(Table, each ([Column2] <> "number")),
    numCols = Table.Column(Number_Columns, "Column1"),
    textColsSID = List.Select(Table.ColumnNames(Source), each Table.Column(Source, _) <> type number),
    textCols = List.RemoveItems(textColsSID, {"Sample ID"}),
    groupedNum = Table.Group(Source, {"Sample ID"},List.Transform(numCols, each {_, (nmr) => List.Sum(nmr),type nullable number})),
    groupedText = Table.Group(Source,{"Sample ID"},List.Transform(textCols, each {_, (tbl) => Text.Combine(tbl, "_")})),
    merged = Table.NestedJoin(groupedNum, {"Sample ID"}, groupedText, {"Sample ID"}, "merged"),
    expanded = Table.ExpandTableColumn(merged, "merged", Table.ColumnNames(merged{1}[merged]))
in
    expanded

Вот что я ожидал получить:

Образец Метод А Метод Б Метод С Метод Г Метод Е ПАРТИЯ Nu Лабораторные данные Образец 1 1 2 5 9 8 ТХ_0001_ТХ_0002 LAB1_LAB2 Образец 2 7 8 8 23 41 ТХ_0001_ТХ_0001 LAB1_LAB1 Образец 3 11 55 ТХ_0394 LAB2 Образец 4 2 9 5 9 ТХ_0394 LAB1
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В одну сторону. Вы могли бы, вероятно, сделать все это и в группе.

let Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
names = List.Distinct(List.Select(Table.ColumnNames(Source), each Text.Contains(_,"Method"))),
#"Grouped Rows" = Table.Group(Source, {"Sample"}, {{"data", each _, type table }}),
#"Added Custom" = Table.AddColumn(#"Grouped Rows", "Batch Nu", each Text.Combine(List.Distinct([data][BATCH Nu]),"_")),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Lab Data", each Text.Combine(List.Distinct([data][Lab Data]),"_")),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "Custom", each Table.SelectRows(Table.UnpivotOtherColumns([data], {"Sample"}, "Attribute", "Value"), each List.Contains(names,[Attribute]))),
#"Added Custom3" = Table.AddColumn(#"Added Custom2", "Custom.1", each Table.Pivot([Custom], List.Distinct([Custom][Attribute]), "Attribute", "Value", List.Sum)),
#"Expanded Custom.1" = Table.ExpandTableColumn(#"Added Custom3" , "Custom.1", names,names),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Custom.1",{"data", "Custom"})
in #"Removed Columns"

Вот метод, который предполагает только то, что первый столбец является столбцом, который будет использоваться для группировки различных выборок.

Он не делает никаких предположений о каких-либо именах столбцов или количестве столбцов.

Он проверяет первые 10 строк в каждом столбце (после удаления всех пустых значений), чтобы определить, может ли тип столбца быть type number, в противном случае предполагается type text.

Если есть другие возможные типы данных, код определения типа может быть расширен.

let
    Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],

//dynamically detect data types from first ten rows
//only detecting "text" and "number"
    colNames = Table.ColumnNames(Source),
    checkRows = 10,
    colTestTypes = List.Generate(
        ()=>[t=
            let 
                Values = List.FirstN(Table.Column(Source,colNames{0}),10),
                tryNumber = List.Transform(List.RemoveNulls(Values), each (try Number.From(_))[HasError])
            in 
                tryNumber,  idx=0],
        each [idx] < List.Count(colNames),
        each [t=
            let 
                Values = List.FirstN(Table.Column(Source,colNames{[idx]+1}),10),
                tryNumber = List.Transform(List.RemoveNulls(Values), each (try Number.From(_))[HasError])
            in 
                tryNumber,  idx=[idx]+1],
        each [t]),
    colTypes = List.Transform(colTestTypes, each if List.AllTrue(_) then type text else type number),

//Group and Sum or Concatenate columns, keying on the first column
    group = Table.Group(Source,{colNames{0}},
        {"rw", (t)=>
        Record.FromList(
            List.Generate(
                ()=>[rw=if colTypes{1} = type number  
                            then List.Sum(Table.Column(t,colNames{1}))
                            else Text.Combine(Table.Column(t,colNames{1}),"_"), 
                        idx=1],
                    each [idx] < List.Count(colNames),
                    each [rw=if colTypes{[idx]+1} = type number  
                                then List.Sum(Table.Column(t,colNames{[idx]+1}))
                                else Text.Combine(Table.Column(t,colNames{[idx]+1}),"_"), 
                            idx=[idx]+1],
                    each [rw]), List.RemoveFirstN(colNames,1)), type record}
        ),

//expand the record column and set the data types
    #"Expanded rw" = Table.ExpandRecordColumn(group, "rw", List.RemoveFirstN(colNames,1)),
    #"Set Data Type" = Table.TransformColumnTypes(#"Expanded rw", List.Zip({colNames, colTypes}))

in
    #"Set Data Type"

Исходные данные

Результаты

Другие вопросы по теме