在另一个度量(不是计算列)中创buildDAX中的运行总计度量

首先,虽然可能无关紧要,但这是我在社区的第一篇文章,这是因为我上周刚刚开始学习DAX。 我认为自己在Excel中相当先进,但是我只是开始了解DAX的function,我在这里学习。

我将首先解释我正在做的事情。

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

FactsSales表包含来自2个国家(美元)和英国(英镑)的销售额,而DimensionsExchangeRate表包含逐月date和汇率(美元兑英镑)。 我想要的是将所有销售额转换为英镑,并且还要有销售额英镑的运行总计量。

我设法完成了这两件事情,并且我通过在FactsSales表(Exchange Rate列和Product Sales GBP列)中创build两个计算列来完成。 在此之后,我设法创build了Running Total Product Sales GBP栏。

现在你可能会想:“好吧,对你有好处,现在停止吹牛,告诉我们你想要什么”。 我想创build一切的措施,而不是一个单一的计算列。

事实上,在马可·鲁索(全能的上帝)的帮助下,我设法编写了汇率的措施,而且我还设法写下产品销售英镑的措施。 所以基本上你会认为我不需要任何这些列。 然而,我遇到的问题是创build“运行总产品销售GBP”度量,除非我的“产品销售GBP”是“计算列”。 如果这是一个措施,我不能设法得到它的工作。


我会写下我使用的公式,所以你可以更好地理解。 首先,这是我的DimensionsExchangeRate表的外观。

date较低的上行汇率

15/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 

但是,现在,当我尝试创build产品销售dateGBP测量(又名“运行总计”)时,我无法完成它的工作。

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的第一个date,以及FactsSalesTable中的第一个date“计算(MAX)”检索的date)我得到一个NUM! 错误,因为外面的“filter”(第一个“计算”function)。

例如,如果我在DimensionsExchangeRate表中的第一个(最早的)date是2015年4月1日,而我的FactsSalesTable包含从2015年1月1日开始的date,那么我将在date中获得错误:2015年1月1日 – 二千〇一十五分之三十一。


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

而现在,因为我有一个计算列,所以我可以很容易地为Running Total创build一个度量。

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

再次,我想要的是使运行总产品销售英镑的工作,没有产品销售英镑的计算列。 我很抱歉这个post很长,但是我可以清楚地解释这个情况。

请参阅TechNet论坛上的回复。

GENERATE()用于在事实表的每一行上创build一个包含适当汇率的表。 然后SUMX()变得非常简单。 这一切都发生在任何filter上下文被应用到事实表中,直接或通过与其相关的维度。

SUMX()变得非常简单。 由于整个事情filter的情况下,可以使用标准时间智能function,只需过滤date表。

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