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

CountIf

CountIf считает общее количество строк в таблице, которые соответствуют условию. CountIf считает каждую строку, а не только уникальные строки.

Синтаксис: CountIf(условие).

Например: в таблице ниже CountIf([Plan] = "Basic") вернёт 3.

ID Plan
1 Basic
2 Basic
3 Basic
4 Business
5 Premium

Примечание

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

Параметры

CountIf принимает функцию или условное выражение, которое возвращает логическое значение (true или false).

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

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

ID Plan Active Subscription
1 Basic true
2 Basic true
3 Basic false
4 Business false
5 Premium true

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

Для подсчёта общего количества строк в таблице, которые соответствуют нескольким обязательным условиям, объедините условия с помощью оператора AND:

CountIf(([Plan] = "Basic" AND [Active Subscription] = true))

Это выражение вернёт 2 на приведенных выше примерах данных (общее количество базовых планов с активной подпиской).

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

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

CountIf(([Plan] = "Basic" OR [Active Subscription] = true))

Возвращает 4 на примере данных: есть три базовых плана, плюс один премиум-план с активной подпиской.

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

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

CountIf(([Plan] = "Basic" OR [Plan] = "Business") AND [Active Subscription] = "false")

Возвращает 2 на примере данных: есть только два базовых или бизнес-плана, которые не имеют активной подписки.

Подсказка

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

Условные подсчёты по группам

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

  1. Напишите CountIf выражение с вашими условиями.
  2. Добавьте столбец Group by в конструктор запросов.

На примере следующих данных:

ID Plan Active Subscription
1 Basic true
2 Basic true
3 Basic false
4 Business false
5 Premium true

Подсчёт общего количества неактивных подписок по плану:

CountIf([Active Subscription] = false)

Как альтернативный вариант, если ваш столбец Active Subscription содержит null (пустые) значения, которые представляют неактивные планы, вы можете использовать:

CountIf([Payment], [Plan] != true)

Примечание

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

Чтобы просмотреть ваши условные подсчёты по плану, установите столбец Group by на "Plan".

Plan Total Inactive Subscriptions
Basic 1
Business 1
Premium 0

Подсказка

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

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

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

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

CountIf принимает функцию или условное выражение, которое возвращает логическое значение (true или false).

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

Glarus BI - case - CumulativeCount

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

case

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

Count(case([Plan] = "Basic", [ID]))

чтобы сделать тоже самое, что и CountIf:

CountIf([Plan] = "Basic")

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

ID: Source A Plan: Source A ID: Source B Plan: Source B
1 Basic
B basic
C basic
4 Business D business
5 Premium E premium

Для подсчёта общего количества базовых планов в обоих источниках вы можете создать выражение case:

  • Посчитать все строки в "ID: Source A" где "Plan: Source A = "Basic"
  • Посчитать все строки в "ID: Source B" где "Plan: Source B = "basic"
Count(case([Plan: Source A] = "Basic", [ID: Source A],
            case([Plan: Source B] = "basic", [ID: Source B])))

CumulativeCount

CountIf не делает накопительные подсчёты. Вам нужно объединить CumulativeCount с case.

В нашем примере данных есть временной ряд:

ID Plan Активная подписка Дата создания
1 Basic true October 1, 2020
2 Basic true October 1, 2020
3 Basic false October 1, 2020
4 Business false November 1, 2020
5 Premium true November 1, 2020

И, допустим, мы хотим получить накопительный подсчёт активных планов, как показано ниже:

Месяц создания Общее количество активных планов на дату
October 2020 2
November 2020 3

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

CumulativeCount(case([Active Subscription] = true, [ID]))

Вам также нужно установить столбец Group by на "Дата создания: месяц".

SQL

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

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

```sql
SELECT COUNT(CASE WHEN plan = "Basic" THEN id END) AS total_basic_plans
FROM accounts

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

CountIf([Plan] = "Basic")

Если вы хотите получить условные подсчёты, разбитые по группам, SQL-запрос:

SELECT
    plan,
    COUNT(CASE WHEN active_subscription = false THEN id END) AS total_inactive_subscriptions
FROM accounts
GROUP BY
    plan

Часть SELECT SQL-запроса соответствует выражению Glarus BI:

CountIf([Active Subscription] = false)

Часть GROUP BY SQL-запроса соответствует Glarus BI Group by установленному на столбец "План".

Таблицы

If our sample data is in a spreadsheet where "ID" is in column A, the spreadsheet formula: В нашем примере данные хранятся в электронной таблице, где "ID" находится в столбце A, формула электронной таблицы:

=CountIf(B:B, "Basic")

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

CountIf([Plan] = "Basic")

Python

If our sample data is in a pandas dataframe column called df, the Python code: В нашем примере данные хранятся в столбце pandas df, код Python:

len(df[df['Plan'] == "Basic"])

использует ту же логику, что и выражение Glarus BI:

CountIf([Plan] = "Basic")

Чтобы получить условный подсчёт с группирующим столбцом:

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

    df_filtered = df[df['Active subscription'] == false]

## Группируйте по столбцу и подсчитывайте строки в каждой группе

    len(df_filtered.groupby('Plan'))

Код Python выше будет производить тот же результат, что и выражение Glarus BI CountIf (с установленным столбцом Group by на "План").

CountIf([Active Subscription] = false)

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