将含多币种转换逻辑的SQL Server T-SQL语句转换为正确DAX表达式
SQL转DAX货币换算实现方案
原DAX代码错误原因
- DAX中VAR声明的变量为只读属性,不支持
TOTAL = TOTAL +这类赋值修改操作 - SUMX为行上下文迭代函数,内部嵌套SUM会触发不必要的上下文转换,逻辑冲突
- 汇率换算逻辑与需求不匹配,未对应参数控制、原币种判断的规则
正确实现方式
1. 动态度量值(推荐,支持参数动态切换)
该方案适配透视表/可视化组件的维度分组,无需额外处理分组逻辑,把REASON、MONEDA_KEY(原币种字段)放到维度区域即可自动按要求分组计算:
换算后金额 = VAR 选中的目标币种 = SELECTEDVALUE(DIM_MONEDA[key], 1) -- 参数默认值为1,对应换算为DOP VAR 原始金额合计 = SUM(FACT_DEALS[ADJUDICADO]) + SUM(FACT_DEALS[MONTO_COTIZADO]) VAR 当前行原币种 = SELECTEDVALUE(FACT_DEALS[MONEDA_KEY], 0) -- 原币种规则:1=DOP 2=USD VAR 固定汇率 = 57 RETURN SWITCH( 选中的目标币种, -- 目标币种为DOP的换算逻辑 1, SWITCH( 当前行原币种, 1, 原始金额合计, 2, 原始金额合计 * 固定汇率, 0 ), -- 目标币种为USD的换算逻辑 2, SWITCH( 当前行原币种, 1, 原始金额合计 / 固定汇率, 2, 原始金额合计, 0 ), 0 )
2. 静态计算表实现(固化结果,等效SQL查询输出)
如果需要直接生成和SQL输出结构完全一致的分组表,可以使用以下计算表代码,修改目标币种参数的值即可等效SQL中SET @CURRENCY的操作:
换算后分组表 = VAR 固定汇率 = 57 VAR 目标币种参数 = 1 -- 可修改为1(转DOP)或2(转USD) -- 先按REASON、原币种分组聚合原始金额 VAR 分组聚合结果 = SUMMARIZE( FACT_DEALS, FACT_DEALS[REASON], FACT_DEALS[MONEDA_KEY], "原始金额合计", SUM(FACT_DEALS[ADJUDICADO]) + SUM(FACT_DEALS[MONTO_COTIZADO]) ) -- 新增换算后的金额列 RETURN ADDCOLUMNS( 分组聚合结果, "DOP", SWITCH( 目标币种参数, 1, SWITCH([MONEDA_KEY], 1, [原始金额合计], 2, [原始金额合计] * 固定汇率, 0), 2, SWITCH([MONEDA_KEY], 1, [原始金额合计]/固定汇率, 2, [原始金额合计], 0), 0 ), "USD", SWITCH( 目标币种参数, 1, SWITCH([MONEDA_KEY], 1, [原始金额合计], 2, [原始金额合计] * 固定汇率, 0), 2, SWITCH([MONEDA_KEY], 1, [原始金额合计]/固定汇率, 2, [原始金额合计], 0), 0 ) )
内容的提问来源于stack exchange,提问作者Cokoro R1
相关产品推荐
相关产品推荐

