Несколько часов я боролся за достижение своей цели.
Цель состоит в том, чтобы использовать список с именами столбцов для агрегирования при использовании Table. Группа вместо фиксированного списка столбцов.
Я уже определил GroupColumns как список для «ключа», и он работает хорошо.
Пример:
=
Table.Group(
Source,
GroupColumns,
{{
"Sales (M€)", each List.Sum([#"Sales (M€)"]), type number},
{"Sales (Qty MU)", each List.Sum([#"Sales (Qty MU)"]), type number}
})
Я определил список с именем SumColumns:
SumColumns = {"Продажи (млн евро)","Продажи (кол-во ед. ед.)"}
Теперь я не могу найти синтаксис для создания списка, который бы динамически создавал все нужные мне столбцы на основе списка SumColumns.
Я предполагал, что получу ответ здесь, но я не понимаю часть «LocalContext»: Как мне правильно использовать table.group в запросе PowerQuery для динамического суммирования различных строк и столбцов?
Я пробовал это:
= Table.Group(
Source,
{GroupColumns},
{{
SumColumns,
(LocalContext) => List.Sum(Table.Column(LocalContext, SumColumns)),
type number
}}
)
Но я получаю сообщение об ошибке «невозможно преобразовать значение типа List в тип Text».
Я попытался выполнить «unpivot», чтобы добиться цели, но у меня возникает та же проблема, когда я хочу повернуть атрибут обратно в столбцы, и в любом случае это будет намного медленнее.
Есть идеи?
Спасибо
Орельен





Это немного сбивает с толку, пытаясь отслеживать контекст среды.
Этот вопрос на один шаг дальше моего ответа в посте, на который вы ссылаетесь, поскольку у нас есть несколько столбцов, а не только один. Поэтому нам нужно сгенерировать список
{
{"Sales (M€)", each List.Sum([#"Sales (M€)"]), type number},
{"Sales (Qty MU)", each List.Sum([#"Sales (Qty MU)"]), type number}
}
Только из списка
SumColumns = {"Sales (M€)", "Sales (Qty MU)"}
Правило состоит в том, что нам нужно заменить столбец C списком, который содержит C, функцию и тип. то есть,
C --> {C, function, type}
Для этого я буду использовать List.Transform на SumColumn, где второй аргумент — это функция, определяющая необходимое преобразование.
List.Transform(SumColumns, (C) => {C, each List.Sum(Table.Column(_, C)), type number})
В этом выражении C представляет имя столбца, а _ занимает место подтаблицы, из которой мы выбираем столбец C для суммирования.
Ввод этого в ваш запрос выглядит так:
Table.Group(
Source,
GroupColumns,
List.Transform(SumColumns, (C) => {C, each List.Sum(Table.Column(_, C)), type number})
)
Это предполагает, что GroupColumns — это список столбцов.
Обратите внимание, что на этот раз я решил использовать конструкцию each _ (которая эквивалентна (_) => _), но я мог бы написать более похоже на то, как я делал ранее, чтобы подчеркнуть захват локального контекста.
Table.Group(
Source,
GroupColumns,
List.Transform(
SumColumns,
(C) => {C, (LocalContext) => List.Sum(Table.Column(LocalContext, C)), type number}
)
)
Примечание. В обоих этих определениях анонимных/лямбда-функций C и LocalContext по сути являются именами переменных, которые я выбрал. Они не являются ключевыми словами или встроенными функциями.
В следующий раз я постараюсь дать больше контекста, ваш ответ очень ясен, большое спасибо! Сработало с первого раза! Эти формулы помогают работать с переменным списком столбцов как с ключом, так и с агрегатом, это здорово!