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 版本允许您在条件不满足时对不同的列进行求和。例如,您可以为“Revenue”创建一个列,该列

  • 当“Plan = Basic”时,对“Payments”列进行求和,
  • 否则对“Contract”列进行求和。
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")

进一步阅读

阅读其他Metabase版本的文档。

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