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:
Это выражение вернёт 2 на приведенных выше примерах данных (общее количество базовых планов с активной подпиской).
Необязательные условия¶
Для подсчёта общего количества строк в таблице, которые соответствуют нескольким необязательным условиям, объедините условия с помощью оператора OR:
Возвращает 4 на примере данных: есть три базовых плана, плюс один премиум-план с активной подпиской.
Смешанные условия¶
Чтобы совместить обязательные и необязательные условия, сгруппируйте условия с помощью скобок:
Возвращает 2 на примере данных: есть только два базовых или бизнес-плана, которые не имеют активной подписки.
Подсказка
Старайтесь помещать скобки вокруг ваших групп AND и OR, чтобы избежать ситуации, когда обязательные условия становятся необязательными (или наоборот).
Условные подсчёты по группам¶
В общем случае, чтобы получить условный подсчёт для категории или группы, например, количество неактивных подписок на план, вам нужно:
- Напишите
CountIfвыражение с вашими условиями. - Добавьте столбец Group by в конструктор запросов.
На примере следующих данных:
| ID | Plan | Active Subscription |
|---|---|---|
| 1 | Basic | true |
| 2 | Basic | true |
| 3 | Basic | false |
| 4 | Business | false |
| 5 | Premium | true |
Подсчёт общего количества неактивных подписок по плану:
Как альтернативный вариант, если ваш столбец Active Subscription содержит null (пустые) значения, которые представляют неактивные планы, вы можете использовать:
Примечание
Оператор "не равно" != должен быть записан как !=.
Чтобы просмотреть ваши условные подсчёты по плану, установите столбец 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:
чтобы сделать тоже самое, что и CountIf:
Версия 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:
Вам также нужно установить столбец Group by на "Дата создания: месяц".
SQL¶
Когда вы выполняете запрос с помощью конструктора запросов, Glarus BI преобразует ваши настройки конструктора запросов (фильтры, сводки и т.д.) в SQL-запрос и запускает этот запрос в вашей базе данных для получения результатов.
В нашем примере данные хранятся в базе данных PostgreSQL, SQL-запрос:
является эквивалентом выражения Glarus BI:
Если вы хотите получить условные подсчёты, разбитые по группам, 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:
Часть 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, формула электронной таблицы:
производит тот же результат, что и выражение Glarus BI:
Python¶
If our sample data is in a pandas dataframe column called df, the Python code:
В нашем примере данные хранятся в столбце pandas df, код Python:
использует ту же логику, что и выражение Glarus BI:
Чтобы получить условный подсчёт с группирующим столбцом:
## Добавьте свои условия
df_filtered = df[df['Active subscription'] == false]
## Группируйте по столбцу и подсчитывайте строки в каждой группе
len(df_filtered.groupby('Plan'))
Код Python выше будет производить тот же результат, что и выражение Glarus BI CountIf (с установленным столбцом Group by на "План").