CountIf
CountIf
计算表中满足条件的总行数。 CountIf
计算每一行,而不仅仅是唯一行。
语法: CountIf(condition)
。
示例:在下面的表中,CountIf([Plan] = "Basic")
将返回 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(([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
组中添加括号的习惯,以避免将必需条件变为可选条件(或反之亦然)。
按组条件计数
通常,要获取类别或组的条件计数,例如按计划统计不活跃订阅的数量,你需要
- 在查询构建器中编写带有条件的
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
其他工具
case
Count(case([Plan] = "Basic", [ID]))
以与 CountIf
相同的方式进行操作
CountIf([Plan] = "Basic")
case
版本允许你在条件不满足时统计不同的列。例如,如果你有来自不同来源的数据
ID: 源 A | 计划: 源 A | ID: 源 B | 计划:来源B |
---|---|---|---|
1 | 基本 | ||
B | 基本 | ||
C | 基本 | ||
4 | 商业 | D | 商业 |
5 | 高级 | E | 高级 |
要计算两个来源中基本计划的总数,你可以创建一个 case
表达式来
- 计算“ID:来源A”中“计划:来源A = “基本”的行数
- 计算“ID:来源B”中“计划:来源B = “基本”的行数
Count(case([Plan: Source A] = "Basic", [ID: Source A],
case([Plan: Source B] = "basic", [ID: Source B])))
CumulativeCount
CountIf
不做累积计数。你需要将 CumulativeCount 与 case
结合使用。
如果我们的样本数据是时间序列
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 |
从 总结 > 自定义表达式 创建聚合
CumulativeCount(case([Active Subscription] = true, [ID]))
你还需要将 按列分组 设置为“创建日期:月份”。
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
SQL 查询的 SELECT
部分与 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 版本的文档。