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

CountIf

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

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

Например: в таблице ниже CountIf([Тариф] = "Базовый") вернёт 3.

ID Тариф
1 Базовый
2 Базовый
3 Базовый
4 Бизнес
5 Премиальный

Предупреждение

Функции агрегации вроде CountIf должны быть добавлены в блок Суммировать > Произвольное выражение.

Параметры

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

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

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

ID Тариф Активная подписка
1 Базовый true
2 Базовый true
3 Базовый false
4 Бизнес false
5 Премиальный true

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

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

CountIf(([Тариф] = "Базовый" AND [Активная подписка] = true))

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

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

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

CountIf(([Тариф] = "Базовый" OR [Активная подписка] = true))

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

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

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

CountIf(([Тариф] = "Базовый" OR [Тариф] = "Бизнес") AND [Активная подписка] = "false")

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

Подсказка

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

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

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

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

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

ID Тариф Активная подписка
1 Базовый true
2 Базовый true
3 Базовый false
4 Бизнес false
5 Премиальный true

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

CountIf([Активная подписка] = false)

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

CountIf([Активная подписка], [Тариф] != true)

Подсказка

Оператор "не равно": !=.

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

Тариф Всего неактивных подписок
Базовый 1
Бизнес 1
Премиальный 0

Подсказка

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

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

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

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

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

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

Различные способы сделать то же самое.

Glarus BI

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

case

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

Count(case([Тариф] = "Базовый", [ID]))

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

CountIf([Тариф] = "Базовый")

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

ID: Источник А Тариф: Источник А ID: Источник Б Тариф: Источник Б
1 Базовый
B базовый
C базовый
4 Бизнес D бизнес
5 Премиальный E премиальный

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

  • Посчитать все строки в "ID: Источник А" где "Тариф: Источник А = "Базовый"
  • Посчитать все строки в "ID: Источник Б" где "Тариф: Источник Б = "базовый"
Count(case([Тариф: Источник А] = "Базовый", [ID: Источник А],
            case([Тариф: Источник Б] = "базовый", [ID: Источник Б])))

CumulativeCount

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

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

ID Тариф Активная подписка Дата создания
1 Базовый true 1 октября, 2024
2 Базовый true 1 октября, 2024
3 Базовый false 1 октября, 2024
4 Бизнес false 1 ноября, 2024
5 Премиальный true 1 ноября, 2024

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

Месяц создания Общее количество активных тарифов на дату
октябрь 2024 2
ноябрь 2024 3

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

CumulativeCount(case([Активная подписка] = true, [ID]))

Вам также нужно установить Суммировать по на "Дата создания: месяц".

SQL

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

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

```sql
SELECT COUNT(CASE WHEN тариф = "Базовый" THEN id END) AS total_basic_plans
FROM accounts

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

CountIf([Тариф] = "Базовый")

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

SELECT
    тариф,
    COUNT(CASE WHEN активная_подписка = false THEN id END) AS счёт_неактивных_подписок
FROM accounts
GROUP BY
    тариф

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

CountIf([Активная подписка] = false)

Часть GROUP BY SQL-запроса соответствует Glarus BI Суммировать по, с выбранным столбцом "Тариф".

Таблицы

В нашем примере данные хранятся в электронной таблице, где "ID" находится в столбце A, формула электронной таблицы:

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

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

CountIf([Тариф] = "Базовый")

Python

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

len(df[df['Тариф'] == "Базовый"])

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

CountIf([Тариф] = "Базовый")

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

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

    df_filtered = df[df['Активная подписка'] == false]

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

    len(df_filtered.groupby('Тариф'))

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

CountIf([Активная подписка] = false)

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