CountIf
CountIf
计算表中与条件匹配的行总数。CountIf
计算每一行,而不仅仅是唯一行。
语法:CountIf(condition)
。
示例:在下表中,CountIf([Plan] = "Basic")
将返回 3。
ID | 计划 |
---|---|
1 | Basic |
2 | Basic |
3 | Basic |
4 | Business |
5 | Premium |
参数
CountIf
接受返回布尔值(true
或 false
)的函数或条件语句。
多个条件
我们将使用以下示例数据向您展示 CountIf
与必需、可选和混合条件。
ID | 计划 | 活动订阅 |
---|---|---|
1 | Basic | true |
2 | Basic | true |
3 | Basic | false |
4 | Business | false |
5 | Premium | 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 | Basic | true |
2 | Basic | true |
3 | Basic | false |
4 | Business | false |
5 | Premium | true |
计算每个计划的非活动订阅总数
CountIf([Active Subscription] = false)
或者,如果您的 活动订阅 列包含代表非活动计划的 null
(空)值,则可以使用
CountIf([Payment], [Plan] != true)
“不等于”运算符
!=
应写为 !=。
要按计划查看您的条件计数,请将分组依据列设置为“计划”。
计划 | 非活动订阅总数 |
---|---|
Basic | 1 |
Business | 1 |
Premium | 0 |
提示:与其他人分享您的工作时,即使
OR
筛选器较短,使用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 | Basic | ||
B | basic | ||
C | basic | ||
4 | Business | D | business |
5 | Premium | E | premium |
要计算两个来源的基本计划总数,您可以创建一个 case
表达式来
- 计算“ID:来源 A”中“计划:来源 A = “Basic””的行数
- 计算“ID:来源 B”中“计划:来源 B = “basic””的行数
Count(case([Plan: Source A] = "Basic", [ID: Source A],
case([Plan: Source B] = "basic", [ID: Source B])))
CumulativeCount
CountIf
不执行运行计数。您需要将 CumulativeCount 与 case
结合使用。
如果我们的示例数据是时间序列
ID | 计划 | 活动订阅 | 创建日期 |
---|---|---|---|
1 | Basic | true | 2020 年 10 月 1 日 |
2 | Basic | true | 2020 年 10 月 1 日 |
3 | Basic | false | 2020 年 10 月 1 日 |
4 | Business | false | 2020 年 11 月 1 日 |
5 | Premium | 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 的文档。