如何在dax中获取一年的数据历史

how to get a year history of data in dax

IIF(SUM
 (
 [Calendar].[Month].CurrentMember.Lag(11) :
 [Calendar].[Month].CurrentMember,
 [Measures].[Qty]
 ) = 0, 0,
SUM
 (
 [Calendar].[Month].CurrentMember.Lag(11) :
 [Calendar].[Month].CurrentMember,
 [Measures].[Num]
 ) /

SUM
 (
 [Calendar].[Month].CurrentMember.Lag(11) :
 [Calendar].[Month].CurrentMember,
 [Measures].[Qty]
 ) )

这是来自多维模型的公式,我正在尝试将此 MDX 公式转换为 DAX 公式以用于管状模型。

12 Month Avg  :=
IF (
    CALCULATE (
        SUM ( [QTY] ),
        FILTER (
            ALL ( Calendar[Month] ),
            Calendar[Month] - 11
                = ( Calendar[Month] - 11 )
        )
    )
        = 0,
    BLANK (),
    CALCULATE (
        SUM ( [Num] ),
        FILTER (
            ALL ( Calendar[Month] ),
            Calendar[Month] - 11
                = ( Calendar[Month] - 11 )
        )
    )
        / CALCULATE (
            SUM ( [QTY] ),
            FILTER (
                ALL ( Calendar[Month] ),
                Calendar[Month] - 11
                    = ( Calendar[Month] - 11 )
            )
        )
)

所以我在顶部制作了这个 DAX 公式来转换 MDX 公式。然而,当我 select 月在枢轴 table 时,它似乎无法正常工作。当我按月过滤时,这两个公式不匹配。我该如何解决这个问题?

1) 创建三个基本度量:

TotalNum := SUM([Num])

TotalQty := SUM([Qty])

Avg := DIVIDE ( [TotalNum], [TotalQty], 0 )

2) 创建一个计算度量来计算上一年的平均值,包括当前所选月份:

AvgLastYear:= CALCULATE ( 
   [Avg] , 
   DATESINPERIOD ( 
       Calendar[Date] , 
       MAX(Calendar[Date]),
       -1, year
   ) 
)

解释:

首先,您不需要除以零的冗长代码,MDX 和 DAX 都有一个 DIVIDE() 函数来隐式处理它。

其次,对于 DAX,我们的想法是构建一个基本度量,然后使用 CALCULATE() 根据需要移动该度量的上下文 - 在本例中为时间段。

这里我们查看当前选择的月份(表示为 MAX(Calendar[Date]),尽管您可以使用任何聚合函数),然后使用 DATESINPERIOD() 在我们的 Calendar table表示T-1年到当前月份的时间段。