这是我在过去开始的一个线程的延续here
一段时间后,我又回来提出类似的问题,但这次想全面了解问题以最终解决问题。
假设我使用以下 Power BI 数据模型:
基于模型,我构建了以下报告:
如您所见,在视觉效果上,我结合了 ProductCategory 和 Product 表中的属性。我还添加了一个度量,这里命名为 [Some Measure],其定义如下:
IF (
ItemStockHistory[# ItemStockCurrent] <= 0;
"No Stock";
DIVIDE (
ItemStockHistory[# ItemStockCurrent];
[Σ SalesUnitQuantity_Last30Days]
)
)
此类度量构建的目标是向分析师显示属于特定类别的所有产品的明确价值,以防度量评估为空白。
不幸的是,我发现覆盖度量中的“自然”空白可能会对表格视觉中显示的数据产生副作用:使用切片器进行过滤无法正常工作 - 当我选择特定产品时像“Office”这样的类别,我得到了这个类别的笛卡尔积和所有的 SKU(也是过滤类别之外的)
对我来说,这是表格建模非常令人惊讶的行为。为什么用显式值覆盖测量 BLANK 结果会影响过滤?
大多数基于 ProductSku 级别的操作报告共享类似的视觉设置,我真的希望支持格式化空白度量,其中一些技术值仍然允许建立关系正常工作,没有奇怪的效果,如笛卡尔积或来自其他视觉效果的过滤器,如切片器
或者我可能不了解表格建模主要范式,想要了解这项技术中默认禁止的内容?
EDIT1
缺失的 ItemStockHistory 表已添加到数据模型图中
答案 0 :(得分:2)
用特定值替换空白肯定会导致这种事情。结果可能是空白的,因为在您的事实表中没有相应的数据行,或者它可能是空白的,因为在维度表中甚至不可能进行这种组合,并且您无法仅通过查看空白来判断哪些是哪些,因此,替换空白将适用于这两种情况或两者都不适用。
我们想忽略不可能的组合。正如@sergiom 正确指出的那样,它们的发生是由于 auto-exist 未启动,因为类别和 SKU 不存在于同一个表中。因为它们在不同的表中,内部逻辑使用了更暴力的交叉连接和过滤方法。但是,您用其他东西替换了空白,从而干扰了过滤部分。
如果您无法创建更清晰的模型,解决此问题的方法是在评估度量之前检查空的交叉连接。
例如,代替
IF ( ISBLANK ( [Measure] ); "No Stock"; [Measure] )
你可能会写一些额外的检查:
IF (
ISEMPTY ( Product ),
BLANK (),
IF ( ISBLANK ( [Measure] ); "No Stock"; [Measure] )
)
这样,您只需评估实际有意义的案例的度量。
答案 1 :(得分:1)
恐怕问题在于您有一个雪花模式。因此,调用度量的客户端生成的查询中的 SUMMARIZECOLUMNS
不会触发自动存在,结果相当于 Product 和 ProductCategory 表字段上的 CROSSJOIN,后跟对结果的过滤器的度量为空白。这就解释了为什么您会看到两个字段的笛卡尔积。
避免此类问题的最佳解决方案是将 ProductCategory 表合并到 Product 表中,以获得 Star Schema 而不是 Snowflake。这样,您的查询将触发自动存在,并且只会使用列的现有组合。
如果无法将雪花模式更改为星型模式,那么当SUMMARIZECOLUMS
(行为类似于CROSSJOIN
)生成的字段组合不存在时,应该将度量修改为返回空白.我认为 ISEMPTY
可能用于执行此测试。