Перейти к содержанию

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:

SumIf([Платёж], ([Тариф] = "Базовый" AND month([Дата получения]) = 10))

Это выражение вернёт 200 на приведенных выше примерах данных: сумма всех платежей, полученных за базовые тарифы в октябре.

Необязательные условия

Чтобы суммировать столбец с несколькими необязательными условиями, объедините условия с помощью оператора OR:

SumIf([Платёж], ([Тариф] = "Базовый" OR [Тариф] = "Бизнес"))

Возвращает 600 на приведённом выше примере данных.

Смешанные условия

Чтобы объединить обязательные и необязательные условия, сгруппируйте условия с помощью скобок:

SumIf([Платёж], ([Тариф] = "Базовый" OR [Тариф] = "Бизнес") AND month([Дата получения]) = 10)

Возвращает 400 на на приведённом выше примере данных.

Tip

Используйте скобки вокруг групп в AND и OR, чтобы избежать логических ошибок, сделав необязательные условия обязательными и наоборот.

Условные итоги по группе

Чтобы получить условный итог для категории или группы, например, общую сумма платежей по тарифу, вам нужно:

  1. Составить выражение sumif.
  2. Добавить блок Суммировать в конструкторе запросов.
Платёж Тариф Дата получения
100 Базовый 1 октября, 2024
100 Базовый 1 октября, 2024
200 Бизнес 1 октября, 2024
200 Бизнес 1 ноября, 2024
400 Премиальный 1 ноября, 2024

Чтобы просуммировать платежи по тарифам "Бизнес" и "Премиальный":

SumIf([Платёж], [Тариф] = "Бизнес" OR [Тариф] = "Премиальный")

Или можно получить сумму платежей по всем тарифам, которые не являются тарифом "Базовый":

SumIf([Платёж], [Тариф] != "Базовый")

Примечание

Оператор "не равно" должен быть записан как !=.

Чтобы просмотреть эти платежи по месяцам, установите в блоке Суммировать: по "Дата получения: Month".

Дата получения: Month Общая сумма по тарифам "Бизнес" и "Премиальный"
Октябрь 200
Ноябрь 600

Подсказка

При совместной работе с другими людьми полезно использовать OR, даже если выражение с != выглядит короче. Включающее OR облегчает понимание того, какие категории (например, тарифы) включены в сумму.

Принимаемые типы данных

Типы данных Работают с SumIf
Строка
Число
Дата и время
Логический
JSON

См. параметры.

Дополнительную информацию о типах данных можно получить в разделе обучения руководства Metabase (англ.).

Связанные функции

Альтернативные способы решения подобных задач.

Glarus BI

Другие инструменты

case

Вы можете объединить Sum и case:

Sum(case([Тариф] = "Базовый", [Платёж]))

делает то же самое, что и SumIf:

SumIf([Платёж], [Тариф] = "Базовый")

Вариант с case позволяет суммировать другой столбец, когда условие не выполняется. Например, вы можете создать столбец "Выручка":

  • суммировать значения в столбце "Платежи" по условию "План = Базовый";
  • суммировать столбец "Контракт" в противном случае.
sum(case([Тариф] = "Базовый", [Платёж], [Contract]))

CumulativeSum

SumIf не считает накопительные итоги. Вам нужно объединить агрегацию CumulativeSum с выражением case.

Например, чтобы получить накопительный итог платежей по тарифам "Бизнес" и "Премиальный" по месяцам (используя наши примеры данных по платежам):

Дата получения: месяц Общая сумма по тарифам "Бизнес" и "Премиальный"
Октябрь 200
Ноябрь 800

Создайте агрегацию из Суммировать > Произвольное выражение:

CumulativeSum(case(([Тариф] = "Базовый" OR [Тариф] = "Премиальный"), [Платёж], 0))

Не забудьте добавить в блоке Суммировать: по "Дата получения: Month".

SQL

Когда вы составляете запрос с помощью конструктора, система преобразует ваши настройки конструктора запросов (фильтры, сводки и т.д.) в SQL-запрос и запускает этот запрос в вашей базе данных для получения результатов.

В нашем примере данные по платежам хранятся в базе данных PostgreSQL, SQL-запрос:

SELECT
    SUM(CASE WHEN plan = "Базовый" THEN payment ELSE 0 END) AS total_payments_basic
FROM invoices

эквивалентен выражению:

SumIf([Платёж], [Тариф] = "Базовый")

Чтобы добавить несколько условий с группирующим столбцом, используйте 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:

SumIf([Платёж], [Тариф] = "Бизнес" OR [Тариф] = "Премиальный")

Часть GROUP BY SQL-запроса отображается в Glarus BI в блоке Суммировать как столбец, установленный на "Дата получения: Month".

Таблицы

Если наш образец данных по платежам находится в электронной таблице, где "Платёж" находится в столбце A, а "Дата получения" — в столбце B, формула электронной таблицы:

=SUMIF(B:B, "Базовый", A:A)

выдаёт тот же результат, что и выражение Glarus BI:

SumIf([Платёж], [Тариф] = "Базовый")

Чтобы добавить дополнительные условия, вам нужно рассмотреть применение ARRAYFORMULA в электронной таблице.

Python

В нашем примере данных по платежам хранятся в структуре данных df pandas, код Python:

df.loc[df['Тариф'] == "Базовый", 'Платёж'].sum()

это эквивалентно выражению в Glarus BI:

SumIf([Платёж], [Тариф] = "Базовый")

Чтобы добавить несколько условий с группирующим столбцом, используйте код 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").

SumIf([Платёж], [Тариф] = "Бизнес" OR [Тариф] = "Премиальный")

Дополнительная информация