CountIf

CountIf 计算表中满足条件的总行数。 CountIf 计算每一行,而不仅仅是唯一行。

语法: CountIf(condition)

示例:在下面的表中,CountIf([Plan] = "Basic") 将返回 3。

ID 计划
1 基本
2 基本
3 基本
4 商业
5 高级

例如 CountIf 这样的聚合操作应该添加到查询构建器的 汇总 菜单 > 自定义表达式(如有需要,请滚动菜单)。

参数

CountIf 接受一个返回布尔值(truefalse)的 函数条件语句

多个条件

我们将使用以下示例数据向您展示如何使用 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:只有两个基本或商业计划没有有效订阅。

提示:养成在 ANDOR 组中添加括号的习惯,以避免将必需条件变为可选条件(或反之亦然)。

按组条件计数

通常,要获取类别或组的条件计数,例如按计划统计不活跃订阅的数量,你需要

  1. 在查询构建器中编写带有条件的 CountIf 表达式。
  2. 在查询构建器中添加一个 按列分组 列。

使用示例数据

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 接受一个返回布尔值(truefalse)的 函数条件语句

以不同的方式做同样的事情,因为尝试新事物很有趣。

Metabase

其他工具

case

你可以将 Countcase 结合使用

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 不做累积计数。你需要将 CumulativeCountcase 结合使用。

如果我们的样本数据是时间序列

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

如果我们的 样本数据 在一个名为 dfpandas 数据框列中,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 版本的文档

想改进这些文档? 提出更改。