CountIf

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

语法:CountIf(condition)

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

ID 计划
1 Basic
2 Basic
3 Basic
4 Business
5 Premium

类似 CountIf聚合函数应添加到查询构建器的汇总菜单 > 自定义表达式(如果需要,请在菜单中向下滚动)。

参数

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

多个条件

我们将使用以下示例数据向您展示 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:只有两个基本或商务计划缺少活动订阅。

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

按组进行条件计数

通常,要获取类别或组的条件计数,例如每个计划的非活动订阅数,您需要

  1. 使用您的条件编写 CountIf 表达式。
  2. 在查询构建器中添加分组依据列。

使用示例数据

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

执行相同操作的不同方法,因为尝试新事物很有趣。

Metabase

其他工具

case

您可以将 Countcase 结合使用

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 不执行运行计数。您需要将 CumulativeCountcase 结合使用。

如果我们的示例数据是时间序列

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

如果我们的示例数据在名为 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 的文档。