SumIf
SumIf
根据条件汇总列中的值。
语法:SumIf(column, condition)
。
示例:在下表中,SumIf([付款], [计划] = "基本")
将返回 200。
付款 | 计划 |
---|---|
100 | 基本 |
100 | 基本 |
200 | 业务 |
200 | 业务 |
400 | 高级 |
参数
多条件
我们将使用以下示例数据向您展示包含必需、可选和混合条件的 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。
提示:养成习惯,在
AND
和OR
组周围加上括号,以避免将必需条件变为可选(反之亦然)。
按组进行条件小计
要获取类别或组的条件小计,例如每个计划的总付款,您需要
- 使用您的条件编写
sumif
公式。 - 在查询构建器中添加按...分组列。
付款 | 计划 | 收到日期 |
---|---|---|
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 (条件)
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
如果我们的付款示例数据存储在名为 df
的 pandas
数据框列中,则 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 的文档。