SumIf
SumIf
根据条件求列值的总和。
语法: SumIf(column, condition)
。
示例: 在下表中的SumIf([Payment], [Plan] = "Basic")
将返回200。
付款 | 计划 |
---|---|
100 | 基础 |
100 | 基础 |
200 | 商业 |
200 | 商业 |
400 | 高级 |
参数
column
可以是数字列的名称,或返回数字列的函数。condition
是一个函数或条件语句,返回布尔值(true
或false
),例如条件语句[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。
提示:养成在
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
版本允许您在条件不满足时对不同的列进行求和。例如,您可以为“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
如果我们付款样本数据在一个名为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版本的文档。