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:
Это выражение вернёт 2 на приведенном выше примере данных (общее количество базовых планов с активной подпиской).
Необязательные условия¶
Для подсчёта общего количества строк в таблице, которые соответствуют нескольким необязательным условиям, объедините условия с помощью оператора OR:
Возвращает 4 на примере данных: есть три базовых тарифа, плюс один премиальный тариф с активной подпиской.
Смешанные условия¶
Чтобы совместить обязательные и необязательные условия, сгруппируйте условия с помощью скобок:
Возвращает 2 на примере данных: есть только два базовых или бизнес-тарифа, которые не имеют активной подписки.
Подсказка
Старайтесь помещать скобки вокруг ваших групп AND и OR, чтобы избежать ситуации, когда обязательные условия становятся необязательными (и наоборот).
Условные подсчёты по группам¶
В общем случае чтобы получить условный подсчёт для категории или группы, например, количество неактивных подписок на тариф, вам нужно:
- Написать выражение
CountIfс вашими условиями. - Добавить столбец Суммировать по в конструктор запросов.
На примере следующих данных:
| ID | Тариф | Активная подписка |
|---|---|---|
| 1 | Базовый | true |
| 2 | Базовый | true |
| 3 | Базовый | false |
| 4 | Бизнес | false |
| 5 | Премиальный | true |
Подсчёт общего количества неактивных подписок по плану:
Если ваш столбец Активная подписка содержит значения null (пустые), которые представляют неактивные тарифы, вы можете использовать:
Подсказка
Оператор "не равно": !=.
Чтобы просмотреть ваши условные подсчёты по плану, выберите в Суммировать столбец "Тариф".
| Тариф | Всего неактивных подписок |
|---|---|
| Базовый | 1 |
| Бизнес | 1 |
| Премиальный | 0 |
Подсказка
При совместной работе с другими людьми полезно использовать OR, даже если фильтр != короче. Включающий OR облегчает понимание того, какие категории (например, тарифы) включены в ваш условный подсчёт.
Поддерживаемые типы данных¶
| Типы данных | Работают с CountIf |
|---|---|
| String | ❌ |
| Number | ❌ |
| Timestamp | ❌ |
| Boolean | ✅ |
| JSON | ❌ |
CountIf принимает функцию или условное выражение, которое возвращает логическое значение (true или false).
Информация о типах данных приведена в разделе обучения руководства Metabase (англ.).
Связанные функции¶
Различные способы сделать то же самое.
Glarus BI
Другие инструменты
case¶
Вы можете объединить Count с case:
чтобы сделать тоже самое, что и 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 |
Создайте агрегацию из Суммировать > Произвольное выражение:
Вам также нужно установить Суммировать по на "Дата создания: месяц".
SQL¶
Когда вы выполняете запрос с помощью конструктора запросов, Glarus BI преобразует ваши настройки конструктора запросов (фильтры, сводки и т.д.) в SQL-запрос и запускает этот запрос в вашей базе данных для получения результатов.
В нашем примере данные хранятся в базе данных PostgreSQL, SQL-запрос:
является эквивалентом выражения Glarus BI:
Если вы хотите получить условные подсчёты, разбитые по группам, SQL-запрос:
SELECT
тариф,
COUNT(CASE WHEN активная_подписка = false THEN id END) AS счёт_неактивных_подписок
FROM accounts
GROUP BY
тариф
Часть SELECT SQL-запроса соответствует выражению Glarus BI:
Часть GROUP BY SQL-запроса соответствует Glarus BI Суммировать по, с выбранным столбцом "Тариф".
Таблицы¶
В нашем примере данные хранятся в электронной таблице, где "ID" находится в столбце A, формула электронной таблицы:
даёт тот же результат, что и выражение Glarus BI:
Python¶
В нашем примере данные хранятся в структуре данных pandas, df, код Python:
использует ту же логику, что и выражение Glarus BI:
Чтобы получить условный подсчёт с группирующим столбцом:
## Добавьте свои условия
df_filtered = df[df['Активная подписка'] == false]
## Группируйте по столбцу и подсчитывайте строки в каждой группе
len(df_filtered.groupby('Тариф'))
Код Python выше будет выводить тот же результат, что и выражение Glarus BI CountIf (с установленным Суммировать по с выбранным столбцом "Тариф").