如何根据当前行和切片器上下文编写DAX度量?

时间:2016-02-26 07:57:18

标签: ssas powerpivot dax tabular

背景信息:对于国际销售表中的每一行,我需要检索过去特定日期的美元汇率,以便分析师可以确定汇率变化的影响关于销售数据。然后,我将使用今天的汇率与过去的汇率之间的差额,并将其乘以销售额来确定影响。

实际问题:如何让以下公式适用于InternationalSales表中的每一行。

IF( HASONEVALUE(SlicerTable[Date]),
LOOKUPVALUE(ExchangeRates[FX_Rate],
            ExchangeRates[CurrencyCode], InternationalSales[CurrencyCode],
            ExchangeRates[Date], SlicerTable[Date]
            ), 
 BLANK())

相关表格是:

  • 'SlicerTable'包含过去[Date]列中过去的相关日期集。该表是切片器的数据源。

  • 'ExchangeRates'与列[CurrencyCode],[Date]和[FX_Rate]。例如(“EUR”,“01/01/2016”,1.143)1月1日欧元兑美元汇率

  • 'InternationalSales'有很多专栏,但其中包括[SaleAmount],[Date]和[CurrencyCode]

对于InternationalSales中的每一行,我试图在切片器中指定的日期查找销售货币的汇率。

我尝试了很多东西,但我总是遇到以下困境:

a)我无法编写计算列,因为它是在处理时计算的,用户在切片器中选择了“日期”

b)我不能写一个度量,因为它不是聚合,我得到错误:

“无法在当前上下文中确定表'InternationalSales'中列'CurrencyCode'的值。检查计算表达式中引用的所有列是否存在,并且没有循环依赖关系。这也可能发生在度量的公式直接指向列而不对该列执行任何聚合(例如求和,平均值或计数)。列没有单个值;它有许多值,表中的每一行都有一个值,并且没有指定行“

1 个答案:

答案 0 :(得分:1)

显然我得到了解决方案,只需将公式放在SUMX中,并将切片器值放在VALUES函数中。

IF( HASONEVALUE(SlicerTable[Date]),
   SUMX(InternationalSales,
      LOOKUPVALUE(ExchangeRates[FX_Rate],
               ExchangeRates[CurrencyCode], InternationalSales[CurrencyCode],
               ExchangeRates[Date], VALUES(SlicerTable[Date])
               ) * InternationalSales[SaleAmount]
   ), 
 BLANK())