DAX度量值除法计算出现异常值问题求助
嘿,我完全懂你卡了6小时有多崩溃,咱们直接说问题出在哪以及怎么修复:
问题根源
你的BuyingPrice度量值在**行上下文(比如SUMX迭代、图表按Date分组)**里没法正确获取全局筛选后的最早日期收盘价。原代码里的FILTER(Stonks, Stonks[Date]=x)会被当前行/分组的Date筛选影响——比如图表每个数据点对应单个Date时,Stonks表已经被自动筛成该日期的行,这时候如果当前Date不是最早日期,FILTER会返回空表,要么报错,要么意外取到当前行的close值,导致你看到所有结果变成340(比如(close*340)/close=340)。
第一步:修复BuyingPrice度量值
把你的BuyingPrice改成下面的写法,确保它不管在什么上下文里,都能稳定拿到全局筛选后的最早日期收盘价:
BuyingPrice = VAR FirstSelectedDate = CALCULATE(MIN(Stonks[Date]), ALLSELECTED(Stonks)) -- 用ALL(Stonks)清除所有行上下文的筛选,确保能找到最早日期的记录 RETURN MAXX( FILTER(ALL(Stonks), Stonks[Date] = FirstSelectedDate), Stonks[close] )
这里用MAXX是因为股票单日收盘价一般是单一值,刚好能准确取到;如果你的表单日有多个close记录,根据需求换成SUM或MINX就行。
第二步:修复目标度量值
如果你要的是StockCountValue / BuyingPrice的结果,直接用标量计算就行,没必要用SUMX(两个都是全局标量):
TargetMeasure = DIVIDE(StockCount[StockCountValue], [BuyingPrice])
用DIVIDE比直接写/更安全,能自动处理除以0的异常情况。
要是你实际想算的是**(持仓量×每日收盘价)/(持仓量×买入价)**(也就是每日价格相对买入价的倍数),可以简化成:
DailyPriceRatio = DIVIDE(SUM(Stonks[close]), [BuyingPrice])
持仓量会被约掉,结果和带持仓量的计算完全一致。
验证效果
改完之后,当StockCountValue是340、BuyingPrice也是340时,图表里每个点应该显示1(或者对应的价格倍数),再也不会全变成340了。
内容的提问来源于stack exchange,提问作者Prime Timer

