Расчетный показатель в таблице AG Grid

Добрый день!
Решается следующая задача:
В таблице AG Grid для отображения есть поля code, month_year, quarter, name1, name2, name3, name4, name5, name6, name7, name8, result (расчетное поле). Пользователь выбирает, какие нерасчетные поля отображать в таблице. В зависимости от выбранных пользователем полей выполняется группировка для расчета поля result.

Исходные данные:
Куб с полями code, month_year, quarter, name1, name2, name3, name4, name5, name6, name7, name8, value

Необходимо рассчитать result по следующему алгоритму:

  1. Рассчитать sum(value) с группировкой по полям code, month_year, quarter и name1, name2, name3, name4 (поля name1, name2, name3, name4 выбрал пользователь на UI, то есть нет возможности указать этот набор полей в кубе)
  2. Рассчитать avg(то, что получили в п.1) с группировкой по name1, name2, name3, name4 (поля name1, name2, name3, name4 выбрал пользователь на UI, то есть нет возможности указать этот набор полей в кубе)
  3. result - итоговое значения после выполнения п1 и п2.

Для п.1. применили следующий подход. Как добавить п2 в этот запрос?:

koob: 'test',
measures: [
 'code',
 'month_year',
 'quarter_num',
 'sum(value)',
 'name1',
 'name2',
 'name3',
 'name4',
],
dimensions: [
 'code',
 'month_year',
 'quarter_num', 
 'name1',
 'name2',
 'name3',
 'name4',
],

Добрый день. Стандартными средствами переиспользовать вычисления из п.1. для получения результата в п.2. не получится. Можно реализовать куб, повторяющий логику из п.1., и его использовать для вычисления avg.

Проблема в том, что реализовать куб, повторяющий логику из п.1. не удастся как раз из-за невозможности предугадать конечный набор полей для группировки. Пользователь в дашборде может задать, что хочет считать параметр по name1 и name2, может задать, что хочет по name3, name4 и name6 (т.е. мы не знаем ни кол-ва полей для группировки, ни их набора заранее).

1). Есть ли какой-то вариант передачи полей в куб через плейсхолдер по аналогии с фильтрами ${filters()}? Например, чтобы убрать п.1. в куб в формате, использовать следующий запрос в кубе, где ${fields()} - поля, которые выбирает пользователь:

select 
${fields()}, sum(value) 
from table 
group by ${fields()}
where ${filters()}

2). Если нельзя перенести логику в куб, можно ли как-то оптимизировать расчет параметра на фронте? Если алгоритм остается прежним: select без агрегаций в кубе, запрос в куб с фронта с суммой, расчет на фронте среднего для полученной выборки.

Плейсхолдеров для полей нет. По второму пункту, если сделать кастомный деш, то можно.

Подскажите, пожалуйста, как оптимизировать расчет на фронте для кастомного дэша?

На данный момент алгоритм расчета следующий:

1). получаем массив данных из запроса

select code, month_year, quarter, <поля_для_группировки>, sum(value)
from (<запрос куба>) as test 
group by code, month_year, quarter, <поля_для_группировки>

2). по полученному массиву данных считаем сумму и кол-во по <поля_для_группировки>, делим сумму на кол-во. Фрагмент кода:

export const avgData = (data, keys) => {
  const result = [];

  const newArr = [];

  data.forEach((el) => {
    const index = result.findIndex((val) =>
      findCriteria(val, el, keys['m'])
    );

    if (index > -1) {
      result[index]['sum_value'] += el['sum_value'];
      result[index].count += 1;
    } else {
      result.push({ ...el, count: 1 });
    }

    return el;
  });

  result.forEach((el) => {
    newArr.push({
      ...el,
      ['sum_value']: el['sum_value'] / el.count,
    });
  });

  return newArr;
};