DAX处理不同月份的周期

时间:2015-12-03 17:05:43

标签: excel powerpivot dax powerbi

我有2张桌子。

第一张表:尺寸表,显示销售周期开始时的可用汽车单位以及这些单位的可用时间。

enter image description here

第二张表:显示在“可用周期”内某个月销售的汽车数量。

enter image description here

我想比较每个周期内的“销售行为”。因此,我想显示在周期内每个阶段销售的单位旁边可用的总初始单位。第二个维度很好,但不是第一个维度。

这就是我得到的:

enter image description here

这是所需的输出(注意available_units的第4行和第5行)

enter image description here

我尝试了以下DAX代码但没有成功:

SumAvailableUnits:=CALCULATE(SUM([available_units]),FILTER(ALL(Table1[month_within_cycle]),[month_within_cycle]>=MAX([months_available])))

1 个答案:

答案 0 :(得分:2)

首先,DAX Formatter是你的朋友。您可能喜欢编写不可读的单行测量,但没有其他人喜欢阅读它们。

我也冒昧地清理你的表名并添加完全限定的列引用。 (忽略您的维度不是纯维度,因为它包含您在度量中聚合的数值)

SumAvailableUnits :=
CALCULATE (
    SUM ( DimCar[available_units] ),
    FILTER (
        ALL ( FactSale[month_within_cycle] ),
        FactSale[month_within_cycle] >= MAX ( DimCar[months_available] )
    )
)

我们马上就看到了问题。使用完全限定的列引用,很明显您正在尝试通过基表(多方)过滤查找表(一侧)。在Power Pivot for Excel中,我们没有双向关系(尽管它们可以在Power BI中使用并且可用于Excel 2016)。我们的关系的过滤器上下文仅从查找表流向基表,通常是从维度到事实。

此外,你的DimCar,通过持有[available_units]和[months_available]编码一个隐含的假设,即特定的[car_id]只能引用一个不变的批次。你永远不会看到[car_id] = 1的另一行。这对我来说非常不可能。即使是这种情况,更好的解决方案是改变模型。

通常,进入行标签或列标签的任何内容都应来自维度,而不是事实。同样,您在度量中聚合的任何内容都应该存在于事实表中。通常的例外是维度计数 - 要么是裸露的,要么是度量的分母。遵循这些将在尺寸建模方面获得80%的成功。您可以在下图中看到我最终得到的表格和模型图。

以下是度量定义

SumAvailableUnits:=SUM( FactAvailability[available_units] )

SumSold:=SUM( FactSale[cars_sold] )

以下是我的源表,带有关系的模型图,以及根据这些部分和上述措施构建的数据透视表。请注意数据透视中[month_within_cycle]的来源。

model

最后,您可能会注意到我的总体行为与您原来的不同。由于每月重复这些值,我们得到的总数要大得多。如果您需要以最近一个月的总和结束(您的样本中看起来像这样),您可以使用下面提供的替代措施。我不明白为什么这将是你想要的总计,但你可以很容易地实现它。就个人而言,我可能会在总体水平上删除该措施。

SumAvailableUnits - GrandTotal:=
SUMX(
    TOPN(
        1
        ,FactAvailability
        ,FactAvailability[month_within_cycle]
        ,0
    )
    ,FactAvailability[available_units]
)

这使用SUMX()来逐步执行由TOPN()定义的表。 TOPN()在FactAvailability中返回第一行(在本例中),包括在按[month_within_cycle]排序之后的tie,在过滤器上下文中可用的所有行中。在特定月份的上下文中,您将获得与该月相关联的所有行 - 与简单总和相同。在总计上下文中,您将获得与上个月相关联的行。

SUMX()遍历该表并累加[available_units]的值。