什么是 Auto-Exists
Auto-Exists 使查询结果只显示现有属性的组合。以超市销售数据为例,在电器类目下显示空调的销售数量是有意义的,显示衬衫是无意义的,因为电器类目下没有衬衫这个 SKU。虽然类目和产品来自不同的列,但是 Auto-Exists 确保两者不会出现错配,只包含现有的属性组合。
触发条件
Auto-Exists 是 SSAS 的一项功能,在所有运行 DAX 或者 MDX 的客户端都能观察到它的存在。当同一个表的两个或多个列被同时筛选时,Auto-Exists 机制就会发挥作用。
理解 Auto-Exists
让我们以下图中的数据模型为例来理解 Auto-Exists。
在模型中,产品、子类别和类别之间存在筛选关系。利用 RELATED 函数,我们还在产品表中添加了反规范化的产品类别和子类别。
基于此模型,你可以轻松构建两个数据透视表,显示按类别和子类别划分的销售额。乍一看,他们的结果是相同的
实际上,DAX 以两种不同的方式计算两个透视表,其实是由于两个不同特性作用于标准查询才提供了相同的结果。它们是自动匹配(Auto-Exists)和移除空行(Empty Row Removal)。Auto-Exists 是服务器特性,而移除空行是透视表特性。让我们来更详细地分析一下它们。
- 反规范化模型使用 Auto-Exists 避免对不存在的集合进行计算。事实上,虽然计算(Audio, MP4&MP3)组合的销售额是有意义的,但是为(Audio, Camcorders)组合进行相同的计算是没有意义的,因为摄像机这个子类别根本不属于音频类别。因此,由于没有同时属于摄像机和音频的产品,DAX 完全可以避免计算这个值,从而减少报表的整体计算时间。
- 规范化模型使用移除空行达到与 Auto-Exists 相同的效果,这是透视表默认启用的特性,如果当前行所有度量值都为空,它会自动隐藏该行。例如,如果有一个产品从来没有被卖出过,那么透视表就会隐藏它,因为这一行不会包含任何有用的信息。
认识移除空行
需要再次强调的是,Auto-Exists 是服务器特性,而移除空行是透视表特性。你可以通过在透视表选项中选择“显示行中的空数据项”复选框来控制移除空行的行为;通过这种方式,你可以禁用移除空行,此时两个表的结果将产生显著区别,如下图所示。
自动匹配与移除空行的内在区别
如果禁用移除空行,规范化模型会对不存在的类别与子类别组合执行计算。另一方面,在反规范化模型中,只对现有组合进行计算。反规范化模型以不同方式运行的原因是由于 Auto-Exists。右侧透视表的两列属于同一个表,所以引擎第一步先确定现有的组合,然后才计算有效值。在 DAX 中,通过以下两个查询模拟,你会注意到这种差异:
------------- 规范化模型 ------------- EVALUATE ADDCOLUMNS ( CROSSJOIN ( VALUES ( 'Product Category'[Category] ), VALUES ( 'Product Subcategory'[Subcategory] ) ), "Sales Amount", [Sales Amount] ) ------------ 反规范化模型 ------------- EVALUATE SUMMARIZECOLUMNS ( 'Product Category'[Category], 'Product Subcategory'[Subcategory], "Sales Amount", [Sales Amount] )
第一个查询使用 CROSSJOIN,返回不存在的类别和子类别组合,第二个查询使用 SUMMARIZE 只返回存在的组合。
Power BI 中的 Auto-Exists
虽然 Power BI 不提供 Excel 移除空行的特性,但会在查询中隐式加入判断当前维度组合行数的度量值,来实现同样的效果,所以即使作为维度的列来自不同的表,Power BI 也默认只显示存在的组合:
Auto-Exists 的潜在影响
到目前为止,这种差异看起来很微妙,似乎无伤大雅。实际上,当你开始编写修改筛选上下文的度量值,在 CALCULATE 中加入筛选器参数时,Auto-Exists 就变得非常重要。如果你不理解这种行为,很可能会认为公式出了 Bug。
结合数据模型一文中的另一个相似案例,希望这两个案例可以帮助你理解 Auto-Exists,它们可能不是很常见,但在某些情况下是理解问题的关键。
总结
Auto-Exists 减少了无效计算,大部分情况下,这是我们希望的效果,但是为了严谨起见,我们还需要进一步厘清它的发生场景:标准的做法是将 Auto-Exists 转移到维度表,而不是在宽表中。
“Auto-Exists 是 SSAS 的一项功能,在所有运行 DAX 或者 MDX 的客户端都能观察到它的存在。当同一个表的两个或多个列被同时筛选时,Auto-Exists 机制就会发挥作用。”高老师,问一下,如果分别在普通的数据透视表和powerpivot创建的数据透视表里面,行和列字段都放同一张表的不同列,会不会出现自动匹配啊?如果不会,是怎么保证透视表里只显示现有属性的组合的?
这里创建的是度量值,DAX公式没有行上下文,为什么不报错?我记得之前讲过计值上下文时,提到:记住,列本身没有值,相反,它对于表中每行都有不同的值。因此如果想要单个值就需要指定所用的行。指定计算所用行的唯一方式是使用行上下文,因为在这个度量值内部不存在行上下文,所以该公式是不正确的,将不予接受。
而截图的CALCULATE第一参数直接是一个列,如果没有行上下文,那应该会报错才对呀。我用POWER PIVOT书写,就会报错
这篇文章中的”引擎将类别和子类别的组合作为筛选器” 这段话, 意思是形成复杂筛选吗? 如果不是的化, 和复杂筛选挺像的, 有啥区别呢?
看了全文,有两个问题:
1. 请问nomalized model和denormalized model的定义是什么?
2. 可以把如何生成的说一下吗?
谢谢
“当 DAX 计算组合的值时,它遵循 CALCULATE 计值流,用 Audio 替代当前类别,从而得到的组合,后者可以被有效计算并显示在透视表中。”,老师你好,这里我不理解为什么CAL会用audio替换当前类别,在哪个章节有解释CAL发生这个行为的计值流吗?
努力学习,这一节,我就记住反正使用星型模型了。但是为什么对于规范化模型结果却错了,反规范化宽表却是正确的还是不明白。
高老师,这个规范化和反规范化,没太明白,这两个透视表,是从哪个表里拉的Row Lables?