本文翻译自国际Power BI大师Marco Russo的文章——《Currency conversion in Power BI reports》,本文介绍如何在Power BI中实现用于报告目的的货币换算。**

应用于报表的货币换算可以包括许多不同的方案:
多币种数据,使用单一货币报告;
多币种数据,使用多币种报告;
单一货币数据,使用多币种报告。

经验是预先应用货币汇率进行转换。因此,在数据导入模型时将所有金额转换为报表中的单一币种对于解决此类场景是个不错的办法。当您需要创建多币种的报表时,预先计算数据可能具有挑战性且成本高昂。因此,基于DAX度量和经过适当设计的数据模型的动态解决方案意义匪浅。

在本文中,我们仅考虑上述的第三种情况,即“使用单一货币的数据,使用多币种进行报告”。第二种情况可以通过转换数据来实现,以便以一种货币将其导入模型中,从而将视线转移到我们今天主要讨论的情况。

引入数据模型

我们考虑的数据模型包括一个销售表,其中所有交易都以美元作为货币记录。还有一个隐藏的汇率表,其中包含每个月中每种货币的汇率,分配给每个月的第一天。

average agerate列是我们认为当月的平均汇率,它必须作为转换率应用于当月包含的所有交易。下图显示了与此描述相关的表。

完整的模型还包括其他表,如产品表和顾客表。下面的报告显示了2008年手机销量表的“Sales Amount”度量。所有的金额都是以美元计算的,美元是用来在销售表中记录交易的单一货币。

目标是使用户能够通过使用切片器选择不同的币种,从而获得如下所选货币为欧元的报告。

在DAX中实现货币换算

Sales Currency度量值将所需的货币换算应用于Sales Amount度量值的结果。为了在DAX中取得良好的性能,最好是将以同一货币和汇率计算的所有金额汇总起来,然后将换算率应用于该总额,而不是将换算应用于每一笔交易。由于此场景中的汇率为每月粒度,因此Sales Currency度量是通过按月对Sales Amount进行分组来实现的,如以下代码所示:


Sales Currency :=
IF (ISCROSSFILTERED ( 'Currency' ),VAR SelectedCurrency =SELECTEDVALUE ( 'Currency'[Currency Code] )VAR DatesExchange =SUMMARIZE (ExchangeRate,'Date'[Calendar Year Month Number],'ExchangeRate'[AverageRate])VAR Result =IF (NOT ISBLANK ( SelectedCurrency ),IF (SelectedCurrency = "USD",[Sales Amount],SUMX (DatesExchange,[Sales Amount] * 'ExchangeRate'[AverageRate])))RETURNResult,[Sales Amount]
)

DatesExchange变量在内存中创建一个表,该表每个月有一行。假设当月有一个单一的汇率,并且选择了一种单一的货币。如果不是这样,这个度量将返回不准确的数字。

Result变量将汇率应用于当月销售额的结果,计算每个月的换算。如果有多种货币可供选择,结果为空白,而如果SelectedCurrency为美元,则返回销售额的值,而不执行任何转换。

您可能需要修改销售币种的业务逻辑,以使公式更好地适应您的特定要求。例如,如果用户选择两种或两种以上货币,则当前显示返回空白,但您可能希望在这种情况下提示错误或显示不同的结果。

利用计算组

使用特定度量(如Sales Currency)定义货币换算有两个缺点:

1.代码和度量重复:货币换算需要应用于显示货币金额的所有度量。如果您有3个度量值(销售额、总成本和利润),则必须创建另外3个度量值,以显示具有所需报告货币的值。

2.格式字符串:Sales Currency度量结果的格式字符串不包含货币符号。在处理具有选定货币的报表时,仅通过查看数字可能很难理解报表使用哪种货币。

通过在计算组中实现货币换算,可以解决这两个问题。在编写本文时,Power BI中的计算组不可用。因此,目前本文的其余部分只能在Azure Analysis Services或Analysis Services 2019中实现。

将货币换算应用于任何度量值的计算项的表达式类似于Sales Currency度量值的定义。它只是将Sales Amount度量引用替换为对SELECTEDMEASURE函数的调用:

--
-- Calculation Group: Currency Conversion
-- Calculation Item : Report Currency
--
VAR SelectedCurrency =SELECTEDVALUE ( 'Currency'[Currency Code], "USD" )
VAR DatesExchange =ADDCOLUMNS (SUMMARIZE (ExchangeRate,'Date'[Calendar Year Month Number]),"@ExchangeAverageRate", CALCULATE (SELECTEDVALUE ( 'ExchangeRate'[AverageRate] )))
VAR Result =IF (ISBLANK ( SelectedCurrency ) || SelectedCurrency = "USD",SELECTEDMEASURE (),-- Single Currency non-US selectedSUMX (DatesExchange,SELECTEDMEASURE () * [@ExchangeAverageRate]))
RETURNResult

由于此转换可以应用于任何度量值,包括百分比和非货币度量值(如#Quantity),因此检查是否应该转换度量值是一种很好的做法。为了在将新度量添加到数据模型时最大限度地减少将来的维护需求,我们可以为度量名称定义命名约定:

#-如果度量名称包括“#”,则度量表示数量,而不是货币值。不应用货币换算。
%-如果度量名称包括“%”,则度量表示百分比,而不是货币值。不应用货币换算。

这样计算项定义更长,但更灵活:

--
-- Calculation Group: Currency Conversion
-- Calculation Item : Report Currency
--
VAR MeasureName =SELECTEDMEASURENAME ()
VAR SkipConversion =NOT ISCROSSFILTERED ( 'Currency' )|| ( SEARCH ( "#", MeasureName, 1, 0 ) > 0 )|| ( SEARCH ( "%", MeasureName, 1, 0 ) > 0 )
RETURNIF (SkipConversion,[Sales Amount],VAR SelectedCurrency =SELECTEDVALUE ( 'Currency'[Currency Code] )VAR DatesExchange =SUMMARIZE (ExchangeRate,'Date'[Calendar Year Month Number],'ExchangeRate'[AverageRate])VAR Result =IF (NOT ISBLANK ( SelectedCurrency ),IF (SelectedCurrency = "USD",[Sales Amount],SUMX (DatesExchange,[Sales Amount] * 'ExchangeRate'[AverageRate])))RETURNResult)

通过使用计算组,还可以通过计算项的格式字符串表达式属性对格式字符串进行动态控制。例如,如果对Currency表进行了选择,则以下表达式使用Currency[Currency Format]列作为格式字符串:

--
-- Calculation Group: Currency Conversion
-- Calculation Item : Report Currency
-- Format String Expression
--
VAR MeasureName = SELECTEDMEASURENAME()
VAR SkipConversion =NOT ISCROSSFILTERED ( 'Currency' )|| (SEARCH ( "#", MeasureName, 1, 0 ) > 0)|| (SEARCH ( "%", MeasureName, 1, 0 ) > 0)
VAR CurrencyFormat =SELECTEDVALUE ( 'Currency'[Currency Format], "#,0.00" )
VAR Result =IF (SkipConversion,SELECTEDMEASUREFORMATSTRING(),CurrencyFormat )
RETURNResult

使用前面的格式字符串表达式,我们得到以下结果。

结论

货币换算应尽可能应用于导入的数据,从而降低查询时所需计算的复杂性。当有必要在查询时选择报告货币时,预先计算所有报告货币可能不切实际,因此可以在DAX度量中实现动态货币换算。您还可以在计算组中实施货币转换,以避免度量值的泛滥(使用和不使用货币换算)并动态修改度量值的格式字符串。

  • PowerPivot工坊原创文章,转载请注明出处!

如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

Power BI 中的货币换算相关推荐

  1. 自动从mysql下载文件到powerbi_关于在Power Query和Power BI中从网页下载文件的小提示...

    ​从网络下载数据时,通常最好是从专门为机器对机器通信而设计的API中获取数据,而不是从屏幕上实际可见的站点中获取数据.下载不仅通常更快,而且还常常获得更多非常有用的附加参数.在本文中,我将向您展示如何 ...

  2. power bi函数_在Power BI中的行上使用聚合函数

    power bi函数 Aggregate functions are one of the main building blocks in Power BI. Being used explicitl ...

  3. power bi 中计算_Power BI中的期间比较

    power bi 中计算 Just recently, I've come across a question on the LinkedIn platform, if it's possible t ...

  4. power bi指标呈现_在Power BI中使用关键绩效指标

    power bi指标呈现 In this article, we will learn Key Performance Indicators usage in Power BI and solve a ...

  5. power bi 创建空表_如何使用R在Power BI中创建地理地图

    power bi 创建空表 介绍 (Introduction) This is the fifth article of a series dedicated to discovering geogr ...

  6. power bi dax_M语言和Power BI中的DAX之间的差异

    power bi dax Microsoft Power BI supports two different languages, M language and DAX (Data Analysis ...

  7. power bi自定义地图_如何使用自定义形状图在Power BI中创建地理图

    power bi自定义地图 介绍 (Introduction) This is the third article of a series dedicated to discovering geogr ...

  8. power bi形状地图_如何使用内置形状图在Power BI中创建地理图

    power bi形状地图 Introduction 介绍 This is the second article of a series dedicated to discovering geograp ...

  9. power bi排序_如何在Power BI中按时间顺序对月份进行排序

    power bi排序 In this article, I'm going to demonstrate how to sort months chronologically in Power BI. ...

  10. Power BI中计算同比、环比

    财务需求中经常要求计算数据的同比.环比,下面介绍如何在Power BI 中创建用来计算同比和环比的度量值(SSAS模型中同理)... 现金表中有金额,时间(时间需要连续的年月日格式),计算同比.环比. ...

最新文章

  1. iOS视频硬编码技术
  2. Dataset之Pascal:Pascal竞赛及其Pascal VOC(VOC 2012、VOC 2007) 数据集的简介、下载、使用方法详细攻略
  3. virtualbox php mac,mac一体机通过Oracle VM VirtualBox装win8.1系统
  4. 使用 lsof 代替 Mac OS X 中的 netstat 查看占用端口的程序
  5. 原版98启动盘镜像.img_装机技巧系列(二):系统安装之Windows 10启动盘制作
  6. Chrome Beta for MacLinux正式发布下载
  7. 使用Python分析网易云歌曲评论信息,我发现了这些有趣的规律
  8. libreoffice python 操作word及excel文档
  9. VCF (Variant Call Format)格式详解
  10. 国际计算机科学期刊,学术|16个国际顶尖计算机期刊介绍与作者教程
  11. JSON格式校验工具
  12. 如何对计算机的系统文件和设置进行更改,Windows 系统常用设置方法与技巧
  13. 机器人操作系统ROS(9)Gazebo物理仿真(摄像头仿真)
  14. 如何找到隐式转换的SQL?
  15. 通关6级之词汇(2021.05.29)
  16. 让微信公众号自动回复可以跳转小程序的消息
  17. 模拟登陆速卖通的小问题,并解决。新手成长路漫漫
  18. reverse方向入门过程
  19. 三大受欢迎的免费开源CMS建站系统
  20. sqlsever2000和mysql_数据库迁移 SQLServer2000到MYsql

热门文章

  1. 【侯捷】C++ STL
  2. Web服务器、应用服务器、数据库服务器之间的关系
  3. Photoshop设计精讲精练笔记(一)
  4. Mand Mobile - 滴滴出品的适用于金融项目的 Vue 移动端 UI 组件库,免费开源、灵活快速、丰富实用
  5. 主表先查出数据再左连接
  6. 八核处理器真的比四核性能强悍吗?
  7. 动点四边形周长最短_中考数学之四边形周长最小值
  8. 你知道PDF怎么合并吗?这些技巧快来码住
  9. 中国第一程序员,微软得不到他就要毁了他!
  10. 【Sql】sql server2008附加数据库:错误9003