Перейти к содержимому

Агрегатные функции

Агрегатные функции применяются ко всем строкам датасета, а не к одной строке. Результат — одно число.

Сумма выражения по всем строкам датасета.

sum(amount)
sum(amount * (1 - tax_rate))
  • Если все значения пусты — 0.
  • Null и пустые значения игнорируются (не считаются как 0; они просто не входят в сумму).

Среднее арифметическое значений выражения. Null’ы игнорируются.

avg(monthly_rent)
avg(roi(sale_price, purchase_price))
  • Если все значения пусты — null.

Количество строк, в которых выражение возвращает непустое (не null, не пустую строку) значение.

count(payment_date) // количество строк с заполненной датой
count(1) // итого строк (1 всегда непусто)

Сумма только положительных значений выражения — «приток». Отрицательные и нулевые значения игнорируются.

sumpos(amount) // все поступления
  • Если положительных значений нет — 0.

Сумма отрицательных значений по модулю — «отток». Возвращается положительным числом, чтобы виджет мог показать «Расход: 12 345 ₽» без игр со знаком.

sumneg(amount) // все списания, по модулю
  • Если отрицательных значений нет — 0.
  • sumpos(amount) - sumneg(amount) = обычный sum(amount) (сальдо).

⚠️ Уточнить: агрегаты работают только когда есть контекст «весь датасет». В виджетах на дашборде такой контекст есть всегда. В формуле-поле — не везде: ошибка Aggregate sum() can't be used in a per-row formula появится, если контекст пуст. Если столкнулись — либо считайте на дашборде через KPI, либо проверьте, не используете ли вы формулу в drill-down вне обычного экрана таблицы.

Конкретный пример, где точно работает: KPI на дашборде:

  • Источник: «Транзакции».
  • Значение: sum(amount).
  • Итог — одна цифра.
  • Пустой датасет: sum/sumpos/sumneg0, avgnull, count0.
  • Все null: то же.
  • Текстовые значения, которые не парсятся как число — игнорируются в sum/avg.
  • sum(amount where category == "X"). В формулах нет фильтрации внутри функции. Фильтруйте на уровне виджета.
  • Используют агрегат для строкового значения. sum("Зарплата") бессмысленен; используйте count для подсчёта.