首先,虽然它可能在某种程度上无关紧要,但这是我在社区中的第一篇文章,这是因为我上周才开始学习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的计算列。对于长篇文章我很抱歉,但是我可以清楚地解释一下情况。
答案 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] )