打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
理解CALCULATETABLE
理解 CALCULATETABLE
CALCULATETABLECALCULATE 的工作方式相同,语法可以参考 CALCULATE ,唯一的区别在于结果的类型:
CALCULATE 计算标量值,而 CALCULATETABLE 计算返回表的表达式,并返回一个表
继续上一篇文章,下面的公式正是我们需要的:它移除了品牌和颜色两个维度的筛选上下文,但是让其他筛选器进入FILTER 函数内部。
[CalcTable Version] :=
CALCULATE (
SUM ( Sales[SalesAmount] ),
FILTER (
CALCULATETABLE (
Product,
ALL ( Product[Brand] ),
ALL ( Product[Color] )
),
AND (
Product[Brand] = "Tailspin Toys",
Product[Color] = "Black"
)
)
)
如图所示,CalcTable 版本的公式计算了正确的值,与CALCULATE 版本返回的值相同。
通过使用CALCULATETABLE 得到了正确的结果
这段关于等效结果转换的题外讨论很重要,因为掌握将布尔筛选器转换为等效FILTER 函数的技术将极大地帮助你处理更复杂的情况。例如,如果你想要表达一个OR 条件,而不是 AND,就需要用到这种方法。
例如,如果想计算品牌是 Tailspin Toys 或颜色是黑色(OR 条件)的所有产品的销售额,那么你需要使用CALCULATETABLE,代码如下所示:
[CalcTable Version OR] :=
CALCULATE (
SUM ( Sales[SalesAmount] ),
FILTER (
CALCULATETABLE (
Product,
ALL ( Product[Brand] ),
ALL ( Product[Color] )
),
OR (
Product[Brand] = "Tailspin Toys",
Product[Color] = "Black"
)
)
)
实际上,使用 CALCULATETABLE 函数从品牌和颜色中删除筛选器是一种便利的方式,可以保持其他筛选器不受影响。因此,有许多列的条件取 AND 时可以很容易地通过简单的CALCULATE 来解决,因为 CALCULATE 自动对所有的筛选器参数取交集。而另一方面,不同列之间的OR 条件要复杂得多,因为你不能依赖于 CALCULATE 自动取交集的行为,需要手动编写复杂的 DAX 代码。
值得注意的是,你还可以使用以下代码作为替代公式,它使用一个两列的ALL 函数:
[ALL Version OR] :=
CALCULATE (
SUM ( Sales[SalesAmount] ),
FILTER (
ALL (
Product[Brand],
Product[Color]
),
OR (
Product[Brand] = "Tailspin Toys",
Product[Color] = "Black"
)
)
)
后一种表达式更优雅,但一开始你可能觉得它不是很直观。
在本文中,你已经看到,一旦使用了多个列,或者通常情况下更复杂的条件,结果将变得难以理解。即使是经验丰富的 DAX 程序员也常常发现很难领会计值流。因此,不要畏惧本章的复杂性;只有积累丰富的经验才能引导你学会如何快速阅读并通晓 DAX 公式。
关于最后这种筛选多列的情景,请读者配合理解 CALCULATE 一文中的最后一节复杂筛选扩展进行理解,此节列举了多列筛选的各种常见情况以及优劣分析
小测试
CALCULATETABLE 对表进行操作,比如你可以用它筛选出 Sales 表中特定产品类别的所有销售记录,很多新人经常会犯的一个错误是直接把 CALCULATETABLE 筛选后的结果用作度量值,比如下面的公式:
Wrong_Measure =
CALCULATETABLE ( Sales, Sales[Category] = "TV" )
这是错误的写法,原因是度量值只能返回标量结果(单个值),而不能返回表,如果你将上面的公式定义到度量值中,会收到错误提示:
该表达式引用多列,多列不能转换为标量值
假设你最终计算的是所有 TV 产品销售记录的最近日期,你需要将 CALCULATETABLE 得到的结果用做筛选器参数,或使用迭代函数进行取值,公式写法:
迭代函数
筛选器参数
M1 =
MAXX (
CALCULATETABLE (
Sales,
Sales[Category] = "TV"
),
sales[order date]
)
CALCULATETABLE vs FILTER
CALCULATETABLE 和FILTER 都可以对表进行筛选,是两个最常用的表函数,了解两者之间的差异有助于你不同场景下选择正确的函数。
FILTER 是迭代函数,无论第一参数使用何种表达式,在大部分情况下,DAX 引擎在计算时会将这些计算的数量减少到条件表达式中包含的列的唯一值的数量。也就是说,影响 FILTER 性能的主要因素是列基数(cardinality),比如以下公式CALCULATE (
SUM ( Movements[Quantity] ),
FILTER (
ALL ( 'Date' ),
'Date'[Date] <= MAX( 'Date'[Date] )
)
)
即使 FILTER 第一参数使用整个日期表,引擎在计算时仍然只考虑主键,即’Date'[Date]列的不重复值,如果使用 DAX Studio 分析 DAX 引擎的查询计划,你会发现两者几乎一致。
CALCULATETABLE 可以像 FILTER 一样执行筛选,在理解 CALCULATE 一文中你已经了解,CALCULATETABLE 使用的布尔筛选器等价于 FILTER 形式的筛选,在这种情况下,两个函数的作用和效果几乎是等价的。但必须注意的是,CALCULATETABLE 始终执行上下文转换,这是它和 FILTER 的一个最大区别。
有一种特殊情况是在 CALCULATETABLE(或 CALCULATE)中使用并列的多个 FILTER 作为筛选器:
ProductsSlow :=
CALCULATE (
DISTINCTCOUNT ( Sales[CustomerKey] ),
FILTER (
VALUES ( Sales[OrderDate] ),
Sales[OrderDate] >= MIN ( DimDate[FullDateKey] )
),
FILTER (
VALUES ( Sales[ShipDate] ),
Sales[ShipDate] <= MAX ( DimDate[FullDateKey] )
),
SalesReason
)
这些筛选器参数可能会生成所有元素组合的临时笛卡尔积,比如这里的两个日期生成笛卡尔积的组合。此时使用嵌套的 FILTER 或在 FILTER 中合并计值条件可以避免这种情况发生,在理解 CALCULATE 一文的多条件并列部分,可以找到详细解释
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DAX:概述ALL函数
CALCULATETABLE 函数 (DAX)
说说Calculate函数中的筛选器参数 - Power Excel
Power BI Desktop 中的 DAX 基本概念
DAX常见函数大全二
如何快速理解一个复杂的DAX?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服