从另一个度量(非计算列)在DAX中创建一个运行总计量

时间:2016-01-09 00:35:53

标签: excel powerpivot dax

首先,虽然它可能在某种程度上无关紧要,但这是我在社区中的第一篇文章,这是因为我上周才开始学习DAX。我认为自己在Excel方面相当先进,但我刚刚开始理解DAX的功能,我在这里学习。

我将首先解释一下我正在尝试做什么。

我有2个不同的表,一个DimensionsExchangeRate表和一个FactsSales表。

FactsSales表包含来自2个国家/地区,美国(美元)和英国(英镑)的销售额,而DimensionsExchangeRate表包含按月的日期和汇率(USD到GBP)。我想要的是转换所有英镑的销售额,并且还有销售英镑的累计销售额。

我已经成功完成了这两件事,我通过在FactsSales表(Exchange Rate列和Product Sales GBP列)中创建两个Calculated Columns来完成。在此之后,我设法创建了Running Total Product Sales GBP列。

现在你可能会想“好吧,对你有好处,现在停止吹牛,告诉我们你想要什么”。我想为所有内容创建度量,而不是一个单独的计算列。

事实上,在Marco Russo(全能的上帝)的帮助下,我设法编写了汇率衡量标准,并且我还设法编写了产品销售英镑衡量标准;所以基本上你认为我不需要任何这些专栏。但是,我遇到的问题是创建“运行总产品销售英镑”度量,除非我的产品销售GBP是计算列。如果这是一项措施,我无法让它发挥作用。

我将在下面写下我使用过的公式,这样你就能更好地理解。首先,这是我的DimensionsExchangeRate表的样子。

日期降低汇率上限

12/15/15 11/18/15 1.523

11/18/15 10/25/15 11/18/15 1.512

10/25/15 9/8/15 10/25/15 1.554

9/8/15 9/8/15 1.593

基本上,汇率将用于较低和较高的销售。

1)

Exchange Rate Measure:=AVERAGEx(FactsSalesTable, 1 *
    LOOKUPVALUE(DimensionsExchangeRate[Exchange Rate],DimensionsExchangeRate[Date],
    CALCULATE(MAX(DimensionsExchangeRate[Date]),
    FILTER(DimensionsExchangeRate, FactsSalesTable[Date]>=DimensionsExchangeRate[Lower])))) -> this measure works ok.

2)

Exchange Rate Calculated Column = LOOKUPVALUE(DimensionsExchangeRate[Exchange Rate],DimensionsExchangeRate[Date],
    CALCULATE(MAX(DimensionsExchangeRate[Date]),
    FILTER(DimensionsExchangeRate, FactsSalesTable[Date]>=DimensionsExchangeRate[Lower]))) -> this calculated column works ok

3)

Product Sales GBP Measure:=SUMX(FactsSalesTable, IF(FactsSalesTable[Country]="USA", FactsSalesTable[Product Sales]/
    AVERAGEx(AA5, 1 *
    LOOKUPVALUE(DimensionsExchangeRate[Exchange Rate],DimensionsExchangeRate[Date],
    CALCULATE(MAX(DimensionsExchangeRate[Date]),
    FILTER(DimensionsExchangeRate, FactsSalesTable[Date]>=DimensionsExchangeRate[Lower])))),
    FactsSalesTable[Product Sales])) -> this measure works ok

但是现在,当我尝试创建产品销售日期GBP措施(又名“运行总计”)时,我无法让它发挥作用。

4)

Product Sales To Date GBP:=Calculate(SUMX(FactsSalesTable, IF(FactsSalesTable[Marketplace]="USA", FactsSalesTable[Product Sales]/

    AVERAGEx(FactsSalesTable, 1 *
    LOOKUPVALUE(DimensionsExchangeRate[Exchange Rate],DimensionsExchangeRate[Date],
    CALCULATE(MAX(DimensionsExchangeRate[Date]),
    FILTER(DimensionsExchangeRate, FactsSalesTable[Date]>=DimensionsExchangeRate[Lower])))),

    FactsSalesTable[Product Sales])),
    FILTER(ALLEXCEPT(FactsSalesTable,DimensionsProducts[Product],DimensionsProducts[Country]), FactsSalesTable[Date] <=MAX (FactsSalesTable[Date] ) ))

此公式的问题是“Calculate(Max())”函数(来自“AverageX”)将返回DimensionExchangeRate表中具有ExchangeRate的第一个日期,以及FactsSalesTable中的第一个日期(在“Calculate(MAX)”检索的日期之前,我得到一个NUM!错误,因为外部的“过滤器”(第一个“计算”功能)。

例如,如果我在DimensionsExchangeRate表中的第一个(最旧的)日期是2015年4月1日,而且我的FactsSalesTable包含从2015年1月1日开始的日期,那么我会收到日期错误:Jan / 1/2015 - 2015年3月31日。

正如我所说,为了完成工作,我必须为产品销售插入计算列GBP = IF(FactsSalesTable [MarketPlace] =“USA”,FactsSalesTable [产品销售] / FactsSalesTable [Exchange率],FactsSalesTable [产品销售])

现在,因为我有一个计算列,我可以轻松地为运行总计创建一个度量。

Total Product Sales GBP To Date:=CALCULATE (SUM (FactsSalesTable[Product Sales GBP] ),
    FILTER(ALLEXCEPT(FactsSalesTable,DimensionsProducts[Product],DimensionsProducts[Country]),  FactsSalesTable[Date] <= MAX ( FactsSalesTable[Date] )))

同样,我想要的是使得运行总产品销售GBP的措施能够运行,而不需要产品销售GBP的计算列。对于长篇文章我很抱歉,但是我可以清楚地解释一下情况。

1 个答案:

答案 0 :(得分:1)

See response on TechNet forums.

GENERATE()用于创建一个表,其中包含事实表每行的相应汇率。然后SUMX()变得非常简单。这一切都发生在任何过滤器上下文中,无论是直接应用于事实表还是通过与之相关的维度。

SUMX()变得非常简单。由于整个事物在过滤器上下文中表现良好,因此可以使用标准时间智能函数,只需过滤日期表。

SalesGBP:=
SUMX(
    GENERATE(
        FactSale
        ,FILTER(
            ExchangeRate
            ,ExchangeRate[LOWER] <= EARLIER( FactSale[Date] )
                && ( ExchangeRate[UPPER] > EARLIER( FactSale[Date] )
                        || ISBLANK( ExchangeRate[UPPER] )
                    )
        )
    )
    ,IF(
        FactSale[Country] = "USA"
        ,FactSale[Sales Amount] / ExchangeRate[EXCHANGE RATE]
        ,FactSale[Sales Amount]
    )
)

Sales:=
IF(
    HASONEVALUE( Display[DisplayCurrency] )
    ,IF(
        VALUES( Display[DisplayCurrency] ) = "USD"
        ,[SalesUSD]
        ,[SalesGBP]
    )
)

SalesYTD:=
TOTALYTD( [Sales], DimDate[Date] )