是否可以创建具有筛选器约束的 SSAS 表格度量值



我正在尝试了解如何为以下方案设计 SSAS 表格模型:我在维度上有一个属性,该属性将修改相关事实数据表上的其他简单度量值。

事实数据表当前为 1.55 亿行。维度有 6200 行。我们需要的度量对单位体积事实求和,然后将该总和乘以属于该维度的因子。用于此度量值的上下文具有一些约束,因此:聚合永远不能包含相关维度中的多行。这样做没有任何商业意义。

我从这个开始,我知道这是错误的:=SUM([Unit Volume])*Products[Foo Factor],当然设计师抱怨,因为相关属性有许多没有特定上下文的值。

我现在的解决方法是创建一个计算列,将因子引入事实数据表:=RELATED(Products[Foo Factor]),然后我可以创建一个如下所示的度量值:=SUM([Unit Volume])*AVERAGE([Foo Factor])

我不喜欢将计算列放在该事实表上的想法。它很大,而且只会变得更大。我也不喜欢似乎没有办法对给定度量的上下文进行约束,这样我就可以确保我们不会在多个产品中汇总数量。还是有?

在我看来,我们的场景并不罕见,但我对 DAX 太陌生,不知道如何正确建模。如果我在我熟悉的SQL世界中,我会使用这样的窗口函数:

select sum([Unit Volume]) over (partition by <context goes here>) as [Unit Volume Total]

是否可以使用 DAX 在度量中创建类似内容?

更新看起来这应该有效,但设计师仍然吠叫:

=CALCULATE(SUM('My Facts'[Unit Volume])*Products[Foo Factor],FILTER(Products,Products[Product Code]="0"))

我的想法是 [产品代码]="0" 筛选器将被当前上下文替换,并且由于 [产品代码] 被定义为相关表上的键,SSAS 会知道我的意图。唉,没有。

我想我可能有它。似乎我可能无法摆脱对 foo 因子使用 AVERAGE 聚合,但 HASONEVALUE 函数确实强制执行了我想要的约束。

这应该有效:

=
IF (
    HASONEVALUE ( Products[Product Code] ),
    SUM ( 'My Facts'[Unit Volume] ) * AVERAGE ( Products[Foo Factor] ),
    SUM ( [Unit Volume] )
)

请尝试以下操作:=计算((总和(我的事实[单位体积])*产品[Foo 因子]),产品[产品代码]=0)

另外,请确认产品代码格式。

最新更新