SumIf

SumIf 根据条件将列中的值相加。

语法:SumIf(column, condition)

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

付款 计划
100 基础版
100 基础版
200 商务版
200 商务版
400 高级版

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

参数

  • column 可以是数字列的名称,也可以是返回数字列的函数。
  • condition 是一个函数或条件语句,它返回一个布尔值(truefalse),例如条件语句 [Payment] > 100

多个条件

我们将使用以下示例数据向您展示带有必需可选混合条件的 SumIf

付款 计划 接收日期
100 基础版 2020 年 10 月 1 日
100 基础版 2020 年 10 月 1 日
200 商务版 2020 年 10 月 1 日
200 商务版 2020 年 11 月 1 日
400 高级版 2020 年 11 月 1 日

必需条件

要根据多个必需条件对列求和,请使用 AND 运算符组合条件

SumIf([Payment], ([Plan] = "Basic" AND month([Date Received]) = 10))

此表达式将在上面的示例数据中返回 200:10 月份基础版计划收到的所有付款的总和。

可选条件

要使用多个可选条件对列求和,请使用 OR 运算符组合条件

SumIf([Payment], ([Plan] = "Basic" OR [Plan] = "Business"))

在示例数据中返回 600。

一些必需条件和一些可选条件

要组合必需条件和可选条件,请使用括号对条件进行分组

SumIf([Payment], ([Plan] = "Basic" OR [Plan] = "Business") AND month([Date Received]) = 10)

在示例数据中返回 400。

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

按组的条件小计

要获得类别或组的条件小计,例如每个计划的总付款额,您需要

  1. 使用条件编写 sumif 公式。
  2. 在查询构建器中添加**分组依据**列。
付款 计划 接收日期
100 基础版 2020 年 10 月 1 日
100 基础版 2020 年 10 月 1 日
200 商务版 2020 年 10 月 1 日
200 商务版 2020 年 11 月 1 日
400 高级版 2020 年 11 月 1 日

要对商务版和高级版计划的付款求和

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

或者,对所有非“基础版”计划的付款求和

SumIf([Payment], [Plan] != "Basic")

“不等于”运算符 != 应写为 !=。

要按月查看这些付款,请将**分组依据**列设置为“接收日期:月份”。

接收日期:月份 商务版和高级版计划的总付款额
十月 200
十一月 600

提示:在与其他人共享您的工作时,即使 != 筛选器较短,使用 OR 筛选器也很有帮助。包含性的 OR 筛选器使您更容易理解哪些类别(例如,计划)包含在总和中。

接受的数据类型

数据类型 适用于 SumIf
字符串
数字
时间戳
布尔值
JSON

请参阅参数

完成同一件事的不同方法,因为 CSV 文件仍然占全球数据的 40%。

Metabase

其他工具

case

您可以将 Sumcase 结合使用

Sum(case([Plan] = "Basic", [Payment]))

以实现与 SumIf 相同的功能

SumIf([Payment], [Plan] = "Basic")

case 版本允许您在条件未满足时对不同的列求和。例如,您可以创建一个名为“收入”的列,该列

  • 在“计划 = 基础版”时对“付款”列求和,以及
  • 否则对“合同”列求和。
sum(case([Plan] = "Basic", [Payment], [Contract]))

CumulativeSum

SumIf 不执行运行总计。您需要将 CumulativeSum 聚合与 case 公式结合使用。

例如,要按月获取商务版和高级版计划的付款运行总计(使用我们的付款示例数据

接收日期:月份 商务版和高级版计划的总付款额
十月 200
十一月 800

从**汇总** > **自定义表达式**创建聚合

CumulativeSum(case(([Plan] = "Basic" OR [Plan] = "Premium"), [Payment], 0))

不要忘记将**分组依据**列设置为“接收日期:月份”。

SQL

当您使用查询构建器运行问题时,Metabase 会将您的查询构建器设置(筛选器、汇总等)转换为 SQL 查询,并针对您的数据库运行该查询以获取结果。

如果我们的付款示例数据存储在 PostgreSQL 数据库中,则 SQL 查询

SELECT
    SUM(CASE WHEN plan = "Basic" THEN payment ELSE 0 END) AS total_payments_basic
FROM invoices

等同于 Metabase 表达式

SumIf([Payment], [Plan] = "Basic")

要添加带有分组列的多个条件,请使用 SQL 查询

SELECT
    DATE_TRUNC("month", date_received)                       AS date_received_month,
    SUM(CASE WHEN plan = "Business" THEN payment ELSE 0 END) AS total_payments_business_or_premium
FROM invoices
GROUP BY
    DATE_TRUNC("month", date_received)

SQL 查询的 SELECT 部分与 Metabase SumIf 表达式匹配

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

SQL 查询的 GROUP BY 部分映射到设置为“接收日期:月份”的 Metabase **分组依据**列。

电子表格

如果我们的付款示例数据在电子表格中,“付款”在 A 列,“接收日期”在 B 列,则电子表格公式

=SUMIF(B:B, "Basic", A:A)

产生与 Metabase 表达式相同的结果

SumIf([Payment], [Plan] = "Basic")

要添加其他条件,您需要切换到电子表格**数组公式**。

Python

如果我们的付款示例数据在名为 dfpandas 数据帧列中,则 Python 代码

df.loc[df['Plan'] == "Basic", 'Payment'].sum()

等同于 Metabase 表达式

SumIf([Payment], [Plan] = "Basic")

要添加带有分组列的多个条件

import datetime as dt

## Optional: convert the column to a datetime object

    df['Date Received'] = pd.to_datetime(df['Date Received'])

## Extract the month and year

    df['Date Received: Month'] = df['Date Received'].dt.to_period('M')

## Add your conditions

    df_filtered = df[(df['Plan'] == 'Business') | (df['Plan'] == 'Premium')]

## Sum and group by

    df_filtered.groupby('Date Received: Month')['Payment'].sum()

这些步骤将产生与 Metabase SumIf 表达式相同的结果(**分组依据**列设置为“接收日期:月份”)。

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

进一步阅读