CountIf
CountIf 用于计算表中满足条件的行总数。 CountIf 计算所有行,而不是仅计算唯一行。
语法: CountIf(condition)。
示例:在下表中, CountIf([Plan] = "Basic") 将返回 3。
| ID | 计划 |
|---|---|
| 1 | 基本 |
| 2 | 基本 |
| 3 | 基本 |
| 4 | 业务 |
| 5 | 高级 |
参数
CountIf 接受返回布尔值(true 或 false)的 函数 或 条件语句。
多个条件
我们将使用以下示例数据向您展示 CountIf 与 必需、可选 和 混合 条件的用法。
| ID | 计划 | 活动订阅 |
|---|---|---|
| 1 | 基本 | true |
| 2 | 基本 | true |
| 3 | 基本 | false |
| 4 | 业务 | false |
| 5 | 高级 | true |
必需条件
要计算表中满足多个必需条件的行总数,请使用 AND 运算符组合这些条件。
CountIf(([Plan] = "Basic" AND [Active Subscription] = true))
此表达式将在上述示例数据中返回 2(具有活动订阅的 Basic 计划的总数)。
可选条件
要计算表中满足多个可选条件的行总数,请使用 OR 运算符组合这些条件。
CountIf(([Plan] = "Basic" OR [Active Subscription] = true))
在示例数据中返回 4:有三个 Basic 计划,外加一个有活动订阅的 Premium 计划。
部分必需和部分可选条件
要组合必需和可选条件,请使用括号对条件进行分组。
CountIf(([Plan] = "Basic" OR [Plan] = "Business") AND [Active Subscription] = "false")
在示例数据中返回 2:只有两个 Basic 或 Business 计划没有活动订阅。
提示:养成习惯,将括号括在
AND和OR组周围,以避免将必需条件变成可选条件(反之亦然)。
按组的条件计数
通常,要获得类别或组的条件计数,例如每个计划的非活动订阅数量,您将
- 编写一个带有您的条件的
CountIf表达式。 - 在查询构建器中添加一个 分组依据 列。
使用示例数据
| ID | 计划 | 活动订阅 |
|---|---|---|
| 1 | 基本 | true |
| 2 | 基本 | true |
| 3 | 基本 | false |
| 4 | 业务 | false |
| 5 | 高级 | true |
计算每个计划的总非活动订阅数
CountIf([Active Subscription] = false)
或者,如果您的“活动订阅”列包含代表非活动计划的 null(空)值,您可以使用
CountIf([Payment], [Plan] != true)
“不等于”运算符
!=应写为 !=。
要查看每个计划的条件计数,请将“分组依据”列设置为“计划”。
| 计划 | 总非活动订阅数 |
|---|---|
| 基本 | 1 |
| 业务 | 1 |
| 高级 | 0 |
提示:在与他人共享工作时,使用
OR过滤器会很有帮助,即使!=过滤器更短。包含性的OR过滤器更容易理解哪些类别(例如,计划)包含在您的条件计数中。
支持的数据类型
| 数据类型 | 与 CountIf 配合使用 |
|---|---|
| 字符串是 | ❌ |
| 数字 | ❌ |
| 时间戳 | ❌ |
| 布尔值 | ✅ |
| JSON | ❌ |
CountIf 接受返回布尔值(true 或 false)的 函数 或 条件语句。
相关函数
Metabase
其他工具
条件累积计数
CountIf 不执行累积计数,而 CumulativeCount 不接受条件(或任何其他参数)。要执行条件累积计数,您需要发挥创意:将 CumulativeSum(不是 CumulativeCount!)与 case 结合使用。思路是使用 case 在满足条件时返回 1,不满足时返回 0,然后计算所有 1 的累积和。
如果我们的示例数据是时间序列
| ID | 计划 | 活动订阅 | 创建日期 |
|---|---|---|---|
| 1 | 基本 | true | 2020年10月1日 |
| 2 | 基本 | true | 2020年10月1日 |
| 3 | 基本 | false | 2020年10月1日 |
| 4 | 业务 | false | 2020年11月1日 |
| 5 | 高级 | true | 2020年11月1日 |
如果我们想获取活动计划的累积计数,如下所示
| 创建日期:月份 | 截至日期的活动计划总数 |
|---|---|
| 2020年10月 | 2 |
| 2020年11月 | 3 |
在汇总 > 自定义表达式中创建一个聚合函数
CumulativeSum(case([Active Subscription] = true, 1,0))
您还需要将“分组依据”列设置为“创建日期:月份”。
SQL
当您使用查询构建器运行问题时,Metabase 会将您的查询构建器设置(过滤器、摘要等)转换为 SQL 查询,并针对您的数据库运行该查询以获取结果。
如果我们的示例数据存储在 PostgreSQL 数据库中,SQL 查询
SELECT COUNT(CASE WHEN plan = "Basic" THEN id END) AS total_basic_plans
FROM accounts
等同于 Metabase 表达式
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 查询与 Metabase 表达式匹配
CountIf([Active Subscription] = false)
SQL 查询的 GROUP BY 部分与 Metabase 的分组依据设置为“计划”列相匹配。
电子表格
如果我们的示例数据在电子表格中,“ID”在 A 列,则电子表格公式
=CountIf(B:B, "Basic")
产生与 Metabase 表达式相同的结果
CountIf([Plan] = "Basic")
Python
如果我们的示例数据在名为 df 的 pandas 数据框列中,Python 代码
len(df[df['Plan'] == "Basic"])
使用与 Metabase 表达式相同的逻辑
CountIf([Plan] = "Basic")
要获取带分组列的条件计数
## Add your conditions
df_filtered = df[df['Active subscription'] == false]
## Group by a column, and count the rows within each group
len(df_filtered.groupby('Plan'))
上面的 Python 代码将产生与 Metabase CountIf 表达式相同的结果(并将分组依据列设置为“计划”)。
CountIf([Active Subscription] = false)
延伸阅读
阅读其他版本的 Metabase 的文档。