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
andOR
groups to avoid making required conditions optional (or vice versa).
Условные итоги по группе¶
Чтобы получить условный итог для категории или группы, например, общая сумма платежей за план, вам нужно:
Напишите
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 | ❌ |
См. параметры.
Связанные функции¶
Разные способы сделать одно и то же, потому что CSV-файлы по-прежнему составляют 40% данных мира.
GlarusBI
Другие инструменты
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-запроса соответствует выражению GlarusBI SumIf
:
SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")
Часть GROUP BY
SQL-запроса отображается в GlarusBI как Group by столбец, установленный на “Date Received: Month”.
Электронные таблицы¶
Если наш образец данных по платежам находится в электронной таблице, где “Платеж” находится в столбце A, а “Дата получения” - в столбце B, формула электронной таблицы:
=SUMIF(B:B, "Basic", A:A)
выдает тот же результат, что и выражение GlarusBI:
SumIf([Payment], [Plan] = "Basic")
Чтобы добавить дополнительные условия, вам нужно переключиться на массивную формулу электронной таблицы.
Python¶
В нашем примере данных по платежам хранятся в столбце df
фрейма данных pandas
, код Python:
df.loc[df['Plan'] == "Basic", 'Payment'].sum()
Эквивалентно выражению GlarusBI:
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()
Эти действия приведут к тому же результату, что и выражение GlarusBI SumIf
(со столбцом Group by, установленным на “Date Received: Month”).
SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")