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").