[DataLens On-premises] Inconsistent aggregation among operands
ERR.DS_API.FORMULA.VALIDATION.AGG.INCONSISTENT
Происходит, когда аргументами одной и той же функции (или операндами одного оператора) являются одновременно агрегированное и неагрегированное выражения.
При вычислении агрегированного значения происходит преобразование большого набора строк в единственное значение. Для этого применяются специальные агрегатные функции. Наиболее часто применяются функции SUM, MIN, MAX, AVG и COUNT. Агрегатные функции рассчитывают и возвращают одно результирующее значение для всех строк запроса. Если используется группировка, то рассчитываются и возвращаются значения отдельно для каждой группы, на которые разбивается результат запроса.
В DataLens вы не можете использовать в одном выражении агрегированные и неагрегированные значения. Нельзя использовать в одном выражении показатели (отображаются в датасете и в визарде синим цветом) и измерения (отображаются в датасете и в визарде зеленым цветом).
Еще ошибка может появиться, когда у оконной функции в разделе WITHIN есть поля, не являющиеся ни агрегацией, ни измерением в чарте.
Как исправить ошибку
Чтобы исправить ошибку:
- Примените агрегацию ко всем полям в выражении.
- Разделите выражение на отдельные показатели.
- Используйте LOD-выражения, чтобы создать вложенные агрегации и агрегации над всеми данными или группами, отличающимися от группировки, заданной на уровне чарта.
Примеры
Пример 1. Деление поля на агрегированную сумму
- Некорректная формула:
[Sales] / SUM([Sales]). - Проблема: Поле
Salesнеагрегированное, аSUM([Sales])— агрегированное. ПолеSalesне является ни агрегацией, ни измерением в рамках группы. Оно не имеет фиксированного значения — в каждой строке оно может быть разным. Поэтому невозможно определить, какое конкретно значение поляSalesдолжно быть выбрано при вычислении выражения[Sales] / SUM([Sales]). Это выражение вычислить невозможно. - Решение: Используйте агрегацию для поля
Sales. Тогда это поле станет показателем. - Корректная формула:
AVG([Sales]) / SUM([Sales]).
Сценарий с делением поля на агрегированную сумму
Для большей наглядности выполните следующий сценарий:
-
Создайте подключение к демонстрационной БД и датасет на основе таблицы
MS_SalesFacts. -
На основе датасета создайте чарт Таблица.
-
Из раздела
Измеренияперетащите полеSalesв секцию Столбцы. К полю не применяется функция агрегации — это измерение. В интерфейсе измерения отображаются зеленым цветом. Они задают группировку в чартах. -
Создайте поле
SUM([Sales])с формулойSUM([Sales])и перетащите его из разделаПоказателив секцию Столбцы. В формуле поля к числовому значению применяется функция агрегации — это показатель. В интерфейсе показатели отображаются синим цветом. Агрегатная функция рассчитывает и возвращает одно результирующее значение для каждой группы, на которые разбивается результат запроса — для каждой группыSalesрассчитывается одно значениеSUM([Sales]). -
Создайте поле
[Sales]/SUM([Sales])с формулой[Sales]/SUM([Sales])и перетащите его из разделаПоказателив секцию Столбцы. Это тоже показатель. ИзмерениеSalesиспользуется при построении чарта и задает группировку для вычисления показателей. Поэтому для вычисления каждого значения[Sales]/SUM([Sales])используется одно конкретное значениеSales, и ошибка не возникает.Агрегация в чарте с группировкой

-
Удалите из секции Столбцы измерение
Sales. Теперь нет измерения, определяющего группировку в чарте, и агрегатные функции рассчитывают и возвращают одно результирующее значение для всех строк запроса. Но в формуле[Sales]/SUM([Sales])присутствует полеSalesбез агрегации, которое не используется при построении чарта и не имеет фиксированного значения. Поэтому непонятно, какое значение поляSalesиспользовать для вычисления значения выражения. Возникает ошибка.Агрегация с ошибкой

-
Из раздела
Измеренияперетащите полеPaymentTypeв секцию Столбцы. Теперь группировку в чарте определяет измерениеPaymentType, и агрегатная функция рассчитывает и возвращает одно результирующее значение для каждой группы. Но в каждой группеPaymentTypeсодержится много записей с разными значениямиSales, поэтому непонятно, какое значение поляSalesиспользовать для вычисления значения выражения[Sales] / SUM([Sales]). Также возникает ошибка. -
Создайте поле
AVG([Sales])/SUM([Sales])с формулойAVG([Sales])/SUM([Sales])и замените на него показатель[Sales]/SUM([Sales])в секции Столбцы. Теперь для каждой группыPaymentTypeвычисляются результирующие значенияAVG([Sales])иSUM([Sales]), которые используются для вычисления значения выраженияAVG([Sales])/SUM([Sales]). Ошибка не возникает.Агрегация без ошибки

Пример 2. Вычитание неагрегированного поля из агрегированного
- Некорректная формула:
[Total Sales] - [Profit]. - Проблема: Поле
Total Salesагрегированное, аProfit— неагрегированное.[Total Sales]— результат комбинирования всех записей группы, а выражение[Profit]имеет разное значение для каждой записи, и для группы не понятно, какое значение нужно брать. Такое выражение лишено смысла, его невозможно вычислить. - Решение: Применить агрегацию к полю
Profit. - Корректная формула:
[Total Sales] - SUM([Profit]).