首页 文章

DAX处理不同月份的周期

提问于
浏览
1

我有2张 table .

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

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 回答

  • 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]的值 .

相关问题