首页 文章

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

提问于
浏览
1

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

我将首先解释我正在尝试做什么 .

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

FactsSales表包含来自2个国家(美国)和英国(英镑)的销售,而DimensionsExchangeRate表包含按月的日期和汇率(USD到GBP) . 我想要的是转换所有的英镑销售额,还有销售英镑的运行总计量 .

我已经设法完成这两件事,我通过在FactsSales表中创建两个计算列(Exchange Rate列和Product Sales GBP列)来完成 . 在此之后,我设法创建了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日开始的日期,那么我将收到日期错误:2015年1月1日 - 3月二千〇一十五分之三十一 .


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

现在,因为我有一个计算列,我可以轻松地为Running Total创建一个度量 .

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

  • 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] )
    

相关问题