如何在Power BI中基于两列货币生成唯一清单并计算对应FX敞口
问题原因说明
你当前使用的DAX计算表方案数值异常偏小,核心问题是DISTINCT会对UNION生成的所有行做全局去重,若两笔不同交易存在相同日期、相同货币、相同头寸值的情况,会被合并为1行,求和时直接丢失对应交易数据。同时手动生成的计算表如果未和日期维度表正确建立关联,会导致筛选器不生效。
最优实现方案:Power Query层拆分行(推荐,性能与稳定性最优)
优先在数据清洗阶段完成双货币列的行拆分,模型层面的数据结构更规范,天然支持所有维度筛选:
- 进入Power Query源数据表编辑界面,添加自定义步骤,使用如下M代码完成双货币行拆分:
= Table.ExpandListColumn( Table.AddColumn(#"替换为你上一步的步骤名称", "货币头寸映射", each { [货币 = [Currency 1], FXNominal = [FX nominal 1], FXNomGross = [FXNom1 - Gross]], [货币 = [Currency 2], FXNominal = [FX nominal 2], FXNomGross = [FXNom2 - Gross]] }), "货币头寸映射" )
- 展开「货币头寸映射」列,删除原有的
Currency 1、Currency 2、FX nominal 1、FX nominal 2、FXNom1 - Gross、FXNom2 - Gross冗余字段,关闭并应用修改。 - 回到Power BI模型视图,将处理后表的
Date字段与你的日期维度表的日期字段建立一对多关联,即可正常使用日期筛选器。
度量值编写(完全对齐Excel计算逻辑)
处理完基础表结构后,直接编写对应度量值,拖入表格/矩阵控件即可生成所需报表:
- 唯一货币清单:直接将处理后表的「货币」字段拖入行维度,Power BI会自动去重,完全匹配Excel中A列的唯一货币提取逻辑。
- 多头(Long)度量值:
Long = CALCULATE( SUM('处理后表名'[FXNominal]), '处理后表名'[FXNominal] > 0 )
- 空头(Short)度量值:
Short = CALCULATE( SUM('处理后表名'[FXNominal]), '处理后表名'[FXNominal] < 0 )
- 净敞口(Net)度量值:
Net = SUM('处理后表名'[FXNominal])
- 总敞口(Gross)度量值:
Gross = SUM('处理后表名'[FXNomGross])
DAX计算表修正方案(若无需Power Query修改可直接使用)
如果不方便修改Power Query逻辑,直接删除原计算表中的DISTINCT即可解决数值偏小问题,修正后代码如下:
FX = UNION ( SELECTCOLUMNS ( DATA, "Date", [DATE], "Currency", [CURRENCY1], "FXNom", [FXNOMINAL1], "FXNomGross", [FXNom1 - Gross] ), SELECTCOLUMNS ( DATA, "Date", [DATE], "Currency", [CURRENCY2], "FXNom", [FXNOMINAL2], "FXNomGross", [FXNom2 - Gross] ) )
后续同样完成与日期维度表的关联,按上述度量值逻辑计算即可。
内容的提问来源于stack exchange,提问作者FumblingwithCoding
相关产品推荐
相关产品推荐

