【自记】Power BI 中FILTER、CALCULATE 和 CALCULATETABLE 三个函数详细说明
这三个都是 DAX 中用于处理筛选逻辑的核心函数,其中 CALCULATE
(返回标量值)和 CALCULATETABLE
(返回表)是 “兄弟函数”,而 FILTER
是用于生成筛选表的基础函数。以下从功能、语法、关联与区别三个方面详细说明:
一、三个函数的核心定位
函数 | 类型 | 返回结果 | 核心作用 |
---|---|---|---|
FILTER | 表函数 | 子表(Table) | 按行级条件筛选表,返回满足条件的所有行 |
CALCULATE | 标量函数 | 单个值(Scalar) | 修改筛选上下文后,计算表达式的结果 |
CALCULATETABLE | 表函数 | 表(Table) | 修改筛选上下文后,返回经过筛选的表 |
二、语法与参数
1. FILTER
函数
- 语法:
FILTER(<表>, <条件表达式>)
- 参数:
<表>
:需要筛选的原始表(如'订单表'
)。<条件表达式>
:返回TRUE/FALSE
的逻辑判断(如'订单表'[金额] > 1000
)。
- 特点:逐行检查原始表,保留满足条件的行,生成子表。
2. CALCULATE
函数
- 语法:
CALCULATE(<表达式>, <筛选器1>, <筛选器2>, ...)
- 参数:
<表达式>
:需要计算的标量表达式(如SUM('订单表'[金额])
)。<筛选器>
(可选):1 个或多个筛选条件(如'产品表'[类别] = "电子产品"
)。
- 特点:先应用所有筛选器修改上下文,再计算表达式的值,返回单个结果。
3. CALCULATETABLE
函数
- 语法:
CALCULATETABLE(<表>, <筛选器1>, <筛选器2>, ...)
- 参数:
<表>
:需要处理的原始表(如'订单表'
)。<筛选器>
(可选):与CALCULATE
相同的筛选条件。
- 特点:先应用所有筛选器修改上下文,再返回经过筛选的表(与
CALCULATE
逻辑一致,但返回表而非标量)。
三、关联与区别:通过示例理解
假设场景:'订单表'
包含 [订单ID]
、[金额]
、[订单日期]
,'产品表'
包含 [产品ID]
、[类别]
,两表已关联。
1. FILTER
与 CALCULATETABLE
的对比(均返回表)
FILTER
示例:筛选金额 > 1000 的订单dax
高金额订单_Filter = FILTER('订单表', '订单表'[金额] > 1000)
- 逻辑:直接逐行判断 “金额是否> 1000”,保留满足条件的行。
CALCULATETABLE
示例:同样筛选金额 > 1000 的订单dax
高金额订单_CalcTable = CALCULATETABLE('订单表', '订单表'[金额] > 1000)
- 逻辑:通过筛选器参数 “强制筛选金额> 1000”,返回符合条件的表。
差异:
FILTER
是 “行级迭代筛选”,适合复杂的行级条件(如跨表字段判断,需配合RELATED
)。CALCULATETABLE
是 “上下文筛选”,适合直接应用筛选器,性能通常更优(尤其大数据量时)。
2. CALCULATE
与 CALCULATETABLE
的对比(同根同源)
CALCULATE
示例:计算 “电子产品” 类别的总销售额dax
电子产品销售额 = CALCULATE(SUM('订单表'[金额]), // 标量表达式'产品表'[类别] = "电子产品" // 筛选器 )
- 逻辑:先将上下文限定为 “电子产品”,再计算该类别下的销售额总和(返回单个值)。
CALCULATETABLE
示例:返回 “电子产品” 类别的所有订单表dax
电子产品订单表 = CALCULATETABLE('订单表', // 表'产品表'[类别] = "电子产品" // 筛选器 )
- 逻辑:与上例筛选逻辑完全相同,但返回的是符合条件的订单表(而非总和)。
关联:二者共享相同的 “筛选上下文修改逻辑”,只是返回结果类型不同(标量 vs 表)。
3. 三个函数的结合使用
FILTER
常作为筛选器参数嵌套在 CALCULATE
或 CALCULATETABLE
中,实现更复杂的筛选:
- 示例:计算 “2023 年金额> 1000 的订单总金额”
dax
2023高金额销售额 = CALCULATE(SUM('订单表'[金额]), // 标量计算FILTER( // 用FILTER生成复杂筛选器'订单表',YEAR('订单表'[订单日期]) = 2023 && '订单表'[金额] > 1000) )
- 逻辑:
FILTER
先筛选出 2023 年且金额 > 1000 的订单行,CALCULATE
基于这个筛选结果计算总和。
四、总结
功能定位:
FILTER
:生成符合行级条件的子表(基础筛选工具)。CALCULATE
:修改上下文后计算标量值(用于度量值、计算列中的动态计算)。CALCULATETABLE
:修改上下文后返回表(用于生成动态子表)。
核心差异:
FILTER
是 “行迭代筛选”,CALCULATE
/CALCULATETABLE
是 “上下文筛选”。CALCULATE
与CALCULATETABLE
逻辑一致,仅返回类型不同(值 vs 表)。
使用场景:
- 简单行筛选:用
FILTER
或CALCULATETABLE
(后者更高效)。 - 动态计算值:用
CALCULATE
(如度量值)。 - 复杂筛选逻辑:
FILTER
嵌套到CALCULATE
/CALCULATETABLE
中。
- 简单行筛选:用
——————————————————————————————
补充
FILTER
函数中可以使用 &&
(逻辑与)、||
(逻辑或)等逻辑运算符组合多个筛选条件,实现更复杂的行级筛选。例如:
dax
// 筛选2023年且金额>1000的订单
FILTER('订单表',YEAR('订单表'[订单日期]) = 2023 && '订单表'[金额] > 1000
)
这里用 &&
同时满足两个条件,只有都为 TRUE
时,该行才会被保留。