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

SumIf

SumIf суммирует значения в столбце на основе условия.

Синтаксис: SumIf(column, condition).

Пример: в таблице ниже SumIf([Payment], [Plan] = "Basic") вернёт 200.

Payment Plan
100 Basic
100 Basic
200 Business
200 Business
400 Premium

Примечание

Функции агрегации такие как sumif должны быть добавлены в Summarize menu > Custom Expression (прокрутите вниз в меню, если это необходимо).

Параметры

  • column может быть именем числового столбца или функцией, возвращающей числовой столбец.
  • condition - это функция или условное выражение, возвращающее логическое значение (true или false), например, условное выражение [Payment] > 100.

Множественные условия

Мы будем использовать следующие примеры данных, чтобы показать вам SumIf с обязательными, необязательными и смешанными условиями.

Payment Plan Date Received
100 Basic October 1, 2020
100 Basic October 1, 2020
200 Business October 1, 2020
200 Business November 1, 2020
400 Premium November 1, 2020

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

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

SumIf([Payment], ([Plan] = "Basic" AND month([Date Received]) = 10))

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

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

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

SumIf([Payment], ([Plan] = "Basic" OR [Plan] = "Business"))

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

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

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

SumIf([Payment], ([Plan] = "Basic" OR [Plan] = "Business") AND month([Date Received]) = 10)

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

Tip

Make it a habit to put parentheses around your AND and OR groups to avoid making required conditions optional (or vice versa).

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

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

  1. Напишите sumif формулу с вашими условиями.
  2. Добавьте столбец Group by в конструктор запросов.
Payment Plan Date Received
100 Basic October 1, 2020
100 Basic October 1, 2020
200 Business October 1, 2020
200 Business November 1, 2020
400 Premium November 1, 2020

Чтобы просуммировать платежи за бизнес- и премиум-планы:

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

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

SumIf([Payment], [Plan] != "Basic")

Примечание

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

Чтобы просмотреть эти платежи по месяцам, установите столбец Group by на "Date Received: Month".

Date Received: Month Total Payments for Business and Premium Plans
October 200
November 600

Подсказка

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

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

Типы данных Работают с SumIf
String
Number
Timestamp
Boolean
JSON

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

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

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

Разные способы сделать одно и то же, потому что CSV-файлы по-прежнему составляют 40% данных мира.

Glarus BI - case - CumulativeSum

Другие инструменты - SQL - Таблицы - Python

case

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

Sum(case([Plan] = "Basic", [Payment]))

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

SumIf([Payment], [Plan] = "Basic")

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

  • Просуммировать столбец "Платежи", когда "План = Базовый", и
  • суммирует столбец "Контракт" в противном случае.
sum(case([Plan] = "Basic", [Payment], [Contract]))

CumulativeSum

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

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

Date Received: Month Total Payments for Business and Premium Plans
October 200
November 800

Создайте агрегацию из Summarize > Custom expression:

CumulativeSum(case(([Plan] = "Basic" OR [Plan] = "Premium"), [Payment], 0))

Не забудьте установить столбец Group by на "Date Received: Month".

SQL

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

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

SELECT
    SUM(CASE WHEN plan = "Basic" THEN payment ELSE 0 END) AS total_payments_basic
FROM invoices

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

SumIf([Payment], [Plan] = "Basic")

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

SELECT
    DATE_TRUNC("month", date_received)                       AS date_received_month,
    SUM(CASE WHEN plan = "Business" 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([Payment], [Plan] = "Business" OR [Plan] = "Premium")

Часть GROUP BY SQL-запроса отображается в Glarus BI как Group by столбец, установленный на "Date Received: Month".

Таблицы

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

=SUMIF(B:B, "Basic", A:A)

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

SumIf([Payment], [Plan] = "Basic")

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

Python

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

df.loc[df['Plan'] == "Basic", 'Payment'].sum()

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

SumIf([Payment], [Plan] = "Basic")

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

import datetime as dt

## Опционально: преобразовать столбец в объект datetime

    df['Date Received'] = pd.to_datetime(df['Date Received'])

## Выделите месяц и год

    df['Date Received: Month'] = df['Date Received'].dt.to_period('M')

## Добавьте свои условия

    df_filtered = df[(df['Plan'] == 'Business') | (df['Plan'] == 'Premium')]

## Сумма и группировка по

    df_filtered.groupby('Date Received: Month')['Payment'].sum()

Эти действия приведут к тому же результату, что и выражение Glarus BI SumIf (со столбцом Group by, установленным на "Date Received: Month").

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

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