DAX分组求和问题:按货币匹配汇率计算总金额
DAX代码问题排查与货币汇率乘积求和实现
问题背景
需要为样本数据中的每笔记录匹配对应货币的汇率,计算金额与汇率乘积的总和。
样本数据(myDF表)
Currency Amount usd 100 eur 75 cny 50 eur 25 jpy 25
预期计算逻辑
100*1 + 75*0.9 + 50*0.5 + 25*0.9 + 25*0.7
汇率表(_SlicerTable表)
Currency RateCol1 USD 1 CNY 0.5 EUR 0.9 JPY 0.7
原代码问题分析
SUMMARIZE用法错误:原代码中SUMMARIZE('myDF',myDF[Currency], 'myDF'[Amount])未对金额做聚合,生成的是包含原表所有行的汇总表,而非按货币分组的金额汇总,后续迭代会出现上下文取值错误。- 大小写匹配问题:样本数据的货币为小写(如
usd),汇率表为大写(如USD),原代码SWITCH用硬编码的大写字符串匹配,会导致部分记录无法匹配到汇率。 - 硬编码汇率变量冗余:手动定义每种货币的汇率变量,扩展性差,新增货币时需修改代码。
- 迭代时列引用错误:迭代
CurrencyAmounts汇总表时直接引用myDF[Currency]和myDF[Amount],此时原表行上下文不存在,无法正确取值。
修正方案
方案1:简洁版(利用LOOKUPVALUE直接匹配)
直接迭代原表每一行,通过LOOKUPVALUE匹配对应汇率,统一大小写避免匹配失败:
_RateMeasure_Fixed = SUMX( 'myDF', 'myDF'[Amount] * LOOKUPVALUE( '_SlicerTable'[RateCol1], '_SlicerTable'[Currency], UPPER('myDF'[Currency]) ) )
方案2:修正原代码逻辑(按货币分组汇总)
如果需要按货币分组计算后求和,可修正SUMMARIZE并动态匹配汇率:
_RateMeasure1_Fixed = VAR CurrencyAmounts = SUMMARIZE( 'myDF', myDF[Currency], "TotalAmount", SUM(myDF[Amount]) // 按货币汇总总金额 ) VAR FullRateTable = ALL('_SlicerTable') // 获取完整汇率表,不受筛选影响 RETURN SUMX( CurrencyAmounts, [TotalAmount] * MAXX( FILTER(FullRateTable, UPPER(_SlicerTable[Currency]) = UPPER([Currency])), _SlicerTable[RateCol1] ) )
结果验证
两种方案均可得到预期计算结果:100*1 + 75*0.9 + 50*0.5 + 25*0.9 + 25*0.7 = 232.5
内容的提问来源于stack exchange,提问作者symkly
相关产品推荐
相关产品推荐

