SumIf¶
SumIf
суммирует значения в столбце на основе условия.
Синтаксис: SumIf(столбец, условие)
.
Пример: в таблице ниже SumIf([Платёж], [Тариф] = "Базовый")
вернёт 200.
Платёж | Тариф |
---|---|
100 | Базовый |
100 | Базовый |
200 | Бизнес |
200 | Бизнес |
400 | Премиальный |
Примечание
Выражения агрегации такие как sumif
должны быть добавлены в блок Суммировать > Произвольные выражения.
Параметры¶
столбец
может быть названием числового столбца или функцией, возвращающей числовой столбец.условие
- это функция или условное выражение, возвращающее логическое значение (true
илиfalse
), например, условное выражение[Платёж] > 100
.
Множественные условия¶
Мы будем использовать следующие примеры данных, чтобы показать вам SumIf
с обязательными, необязательными и смешанными условиями.
Платёж | Тариф | Дата получения |
---|---|---|
100 | Базовый | 1 октября, 2024 |
100 | Базовый | 1 октября, 2024 |
200 | Бизнес | 1 октября, 2024 |
200 | Бизнес | 1 ноября, 2024 |
400 | Премиальный | 1 ноября, 2024 |
Обязательные условия¶
Чтобы суммировать столбец на основе нескольких обязательных условий, объедините условия с помощью оператора AND
:
Это выражение вернёт 200 на приведенных выше примерах данных: сумма всех платежей, полученных за базовые тарифы в октябре.
Необязательные условия¶
Чтобы суммировать столбец с несколькими необязательными условиями, объедините условия с помощью оператора OR
:
Возвращает 600 на приведённом выше примере данных.
Смешанные условия¶
Чтобы объединить обязательные и необязательные условия, сгруппируйте условия с помощью скобок:
Возвращает 400 на на приведённом выше примере данных.
Tip
Используйте скобки вокруг групп в AND
и OR
, чтобы избежать логических ошибок, сделав необязательные условия обязательными и наоборот.
Условные итоги по группе¶
Чтобы получить условный итог для категории или группы, например, общую сумма платежей по тарифу, вам нужно:
- Составить выражение
sumif
. - Добавить блок Суммировать в конструкторе запросов.
Платёж | Тариф | Дата получения |
---|---|---|
100 | Базовый | 1 октября, 2024 |
100 | Базовый | 1 октября, 2024 |
200 | Бизнес | 1 октября, 2024 |
200 | Бизнес | 1 ноября, 2024 |
400 | Премиальный | 1 ноября, 2024 |
Чтобы просуммировать платежи по тарифам "Бизнес" и "Премиальный":
Или можно получить сумму платежей по всем тарифам, которые не являются тарифом "Базовый":
Примечание
Оператор "не равно" должен быть записан как !=
.
Чтобы просмотреть эти платежи по месяцам, установите в блоке Суммировать: по "Дата получения: Month".
Дата получения: Month | Общая сумма по тарифам "Бизнес" и "Премиальный" |
---|---|
Октябрь | 200 |
Ноябрь | 600 |
Подсказка
При совместной работе с другими людьми полезно использовать OR
, даже если выражение с !=
выглядит короче. Включающее OR
облегчает понимание того, какие категории (например, тарифы) включены в сумму.
Принимаемые типы данных¶
Типы данных | Работают с SumIf |
---|---|
Строка | ❌ |
Число | ✅ |
Дата и время | ❌ |
Логический | ✅ |
JSON | ❌ |
См. параметры.
Дополнительную информацию о типах данных можно получить в разделе обучения руководства Metabase (англ.).
Связанные функции¶
Альтернативные способы решения подобных задач.
Glarus BI
Другие инструменты
case¶
Вы можете объединить Sum
и case
:
делает то же самое, что и SumIf
:
Вариант с case
позволяет суммировать другой столбец, когда условие не выполняется. Например, вы можете создать столбец "Выручка":
- суммировать значения в столбце "Платежи" по условию "План = Базовый";
- суммировать столбец "Контракт" в противном случае.
CumulativeSum¶
SumIf
не считает накопительные итоги. Вам нужно объединить агрегацию CumulativeSum с выражением case
.
Например, чтобы получить накопительный итог платежей по тарифам "Бизнес" и "Премиальный" по месяцам (используя наши примеры данных по платежам):
Дата получения: месяц | Общая сумма по тарифам "Бизнес" и "Премиальный" |
---|---|
Октябрь | 200 |
Ноябрь | 800 |
Создайте агрегацию из Суммировать > Произвольное выражение:
Не забудьте добавить в блоке Суммировать: по "Дата получения: Month".
SQL¶
Когда вы составляете запрос с помощью конструктора, система преобразует ваши настройки конструктора запросов (фильтры, сводки и т.д.) в SQL-запрос и запускает этот запрос в вашей базе данных для получения результатов.
В нашем примере данные по платежам хранятся в базе данных PostgreSQL, SQL-запрос:
SELECT
SUM(CASE WHEN plan = "Базовый" THEN payment ELSE 0 END) AS total_payments_basic
FROM invoices
эквивалентен выражению:
Чтобы добавить несколько условий с группирующим столбцом, используйте SQL-запрос:
SELECT
DATE_TRUNC("month", date_received) AS date_received_month,
SUM(CASE WHEN plan = "Бизнес" THEN payment ELSE 0 END) AS total_payments_business_or_premium
FROM invoices
GROUP BY
DATE_TRUNC("month", date_received)
Часть SELECT
SQL-запроса соответствует выражению Glarus BI SumIf
:
Часть GROUP BY
SQL-запроса отображается в Glarus BI в блоке Суммировать как столбец, установленный на "Дата получения: Month".
Таблицы¶
Если наш образец данных по платежам находится в электронной таблице, где "Платёж" находится в столбце A, а "Дата получения" — в столбце B, формула электронной таблицы:
выдаёт тот же результат, что и выражение Glarus BI:
Чтобы добавить дополнительные условия, вам нужно рассмотреть применение ARRAYFORMULA в электронной таблице.
Python¶
В нашем примере данных по платежам хранятся в структуре данных df
pandas
, код Python:
это эквивалентно выражению в Glarus BI:
Чтобы добавить несколько условий с группирующим столбцом, используйте код Python:
import datetime as dt
## Опционально: преобразовать столбец в объект datetime
df['Дата получения'] = pd.to_datetime(df['Дата получения'])
## Выделите месяц и год
df['Дата получения: месяц'] = df['Дата получения'].dt.to_period('M')
## Добавьте свои условия
df_filtered = df[(df['Тариф'] == 'Бизнес') | (df['Тариф'] == 'Премиальный')]
## Сумма и группировка по
df_filtered.groupby('Дата получения: месяц')['Платёж'].sum()
Эти действия приведут к тому же результату, что и выражение Glarus BI SumIf
(со столбцом в Суммировать, установленным на "Дата получения: Month").