PowerBI 动态数据格式 高级版 以及重要通知
最近有很多内容在研究和更新,但公众号内容,永远是只会迟到,但不会缺席,更会发出很多干货。
今天是来自罗丝钉伙伴的一个真实问题。(罗叔的会员群伙伴,简称螺丝钉,比较善于挤,善于钻)
问题重述
一般我们并不提倡互动式回答问题,非常随意而低效。
熟悉我们的螺丝钉同学们,会认真的把问题整理后发出,那必然会得到专业的回复。
问题如下:
需求:
在一个界面展示不同指标的同比分析结果。
通用的同比分析表:
需要的指标切片器:
- 销售额/万元
- 利润/万元
- 利润率/%
期望达到的展示效果:
1.当指标为销售额或利润时,本期值、上年同期值数据格式为小数,增长率为百分比。
2.当指标为利润率时,本期值、上年同期值数据格式为百分比,这时不能计算同比增长率,而应计算同比增加值,单位为百分点。
问题:采用计算组能解决不同类别指标的动态数据格式问题,但无法解决利润率的同比增加值计算逻辑,因为针对率指标的同比计算公式不一样了。
请教:是否有解决思路和方法?
——
以上就是来自螺丝钉的问题了。那么,这种问题问地就很清楚,老师只能回答:能还是不能了。
而我们必须得能啊。
效果预览
这个是一个很通用和重要的场景,我们先给出结果,如下:
该问题非常有意义,它的精妙之处在于:
- 销售额的显示,本期和上期是值,而同比增长是%;
- 利润率的显示,本期和上期是率,而同比增长是值。
这在显示上完全是互斥的需求。
基础知识
这个实现非常重要,为了完成这个,您应该先了解此前的一篇文章:
有了这个基础,我们再来看今天的问题。
格式与格式表达式
先来区分两个词语:
格式与格式表达式是不同的,请看:
这叫格式(文本)。
而再请看:
这叫格式表达式。
不难猜到:格式文本是一次性设置;而格式表达式是一个公式,它可以在运行时根据用户的选择来改变格式。所以,我们往往需要借助的是格式表达式的动态计算特性。
技巧
我们需要记住的只有一点:
如果在拖拽或选择切片器后,希望根本不同的选择,显示不同的格式,一定是用格式表达式。
实现-准备
我们先来实现 KPI 选项,如下:
Option.KPI =
SELECTCOLUMNS(
{
( "Sales" , "销售" , 1 ),
( "Profit" , "利润" , 2 ),
( "Volume" , "销量" , 3 ),
( "Profit%" , "利润率" , 4 )
} , "KPICode" , [Value1] , "KPIName" , [Value2] , "OrderBy" , [Value3] )
这是很经典的实现,包括选项的三要素:
- Code: 不变的代码
- Name: 可以随时根据用户诉求调整的名称文本
- OrderBy: 用来支持自定义排序
从今天起,您应该将这三要素改为四要素,再加入:
- Format: 数据格式
更新后,如下:
Option.KPI =
SELECTCOLUMNS(
{
( "Sales" , "销售" , 1 , "NUM" ),
( "Profit" , "利润" , 2 , "NUM"),
( "Volume" , "销量" , 3 , "INT"),
( "Profit%" , "利润率" , 4 , "PCT")
} , "KPICode" , [Value1] , "KPIName" , [Value2] , "OrderBy" , [Value3] , "DataType" , [Value4] )
这样更具通用性。
实现-动态格式表达式
对于计算组,可以这样设置:
这样就实现了 AC 的计算逻辑,再来实现格式化逻辑,如下:
对于 AC 可能是:销售额或利润率,所以判断其数据类型,如果是利润率的话,则使用百分比符号,反之全部使用整数格式。
而更复杂的是ΔPY的计算,是这样的:
根据需求,这里面蕴含了两套逻辑,如果是数值型的,计算增长率;如果是比率型的,只计算增长即可,因此,有:
注意,比率型的增长要改为点数。也就是说:例如率增加 1%,其实是增加了 1 个点。所以,1% 要视为 0.01,再进而视作 1 个点。
其对应的格式表达式为:
这与普通的情况正好是相反的。
于是就实现了:
这样,就可以类似的拓展了,可以实现非常多的度量值转换。
完。
再进一步
这个功能已经实现了。以下内容很高阶,初学者可以略过。
但这并非我们的调性。我们还收集到螺丝钉们的问题,如:
计算组和参数表都可以实现类似的效果,只不过用参数表的方法不能实现动态格式而已。
例如:
其度量值写法如下:
从功能来说,我们使用参数表得到了完全一样的结果,但格式并不一致。
那我们就用一个方法来进行破除。
我们现在知道:
- 计算组可以动态计算格式
- 参数表结合SWITCH结果也可以做多分支计算
那么自然想到:是否可以让计算组只完成一件事就是格式表达式呢?
答案是肯定的,设置如下:
看不懂不要紧,来看看效果吧先:
可以注意到:这里多出了一个 Format 层,这层就像是一个管道,不带有格式的数值透过这个管道后就可以带有正确的格式来显示了。
用这种技巧和方法,暂时需要这么一层。那这个技巧有什么好处呢,似乎没看出来。
其好处在本例中并不明显,但如果你可以举一反三的话,这个技巧整个开启了一套数据格式通用解决方案,该方案可以:
一站式解决一个PowerBI文件全部格式设置问题。
你没有看错,由于方法太过劲爆,必须独立一篇文章,但读到这里的伙伴在理论上应该可以想到我说的是什么。如果你可以想到,那么证明您的举一反三能力是超强的;没有想到也不要紧,继续关注即可。
总结
本文从实际案例出发,引导并给出了数据格式的高级设置方法并即将开启重磅文章揭示数据格式通用解决方案。敬请留意。
- 【推荐】开源项目minapp-重新定义微信小程序的开发
- 【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
- hadoop性能调优
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
- DiscuzX v3.4 任意文件删除漏洞
- 系列3|走进Node.js之多进程模型
- Java中Arraylist与linkedlist的区别
- 手把手教你撸一个 Webpack Loader
- HashMap与HashTable区别
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
- React Native 网络层分析
- 如何实现VM框架中的数据绑定
- Java盲点解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于Curl在Swoole协程中的解决方案详析
- Flutter随机迷宫生成和解迷宫小游戏功能的源码
- Yii框架实现对数据库的CURD操作示例
- Laravel5.4框架中视图共享数据的方法详解
- Android视频悬浮窗口实现的示例代码
- 使用Laravel中的查询构造器实现增删改查功能
- Flutter 自定义Drawer 滑出位置的大小实例代码详解
- laravel5.1框架基础之路由详解
- flutter 自定义card阴影效果及card使用
- laravel5.1框架基础之Blade模板继承简单使用方法分析
- Yii框架的布局文件实例分析
- React Native 实现热更新并自动签名打包功能
- PHP命名空间用法实例分析
- Android自定义控件实现方向盘效果
- Android 使用fast-verification实现验证码填写功能的实例代码