PowerBI开发 第三篇:报表设计技巧

最近做了几个PowerBI报表,对PowerBI的设计有了更深的理解,对数据的塑形(sharp data),不仅可以在Data Source中实现,例如在TSQL查询脚本中,而且可以在PowerBI中实现,例如,向数据模型中添加自定义字段,或者在报表数据显示时,根据数据表之间的关系做数据的统计。本文主要介绍数据的塑形和UI设计的微调。

一,创建数据列

PowerBI报表的数据分为数据源(Data Source),数据模型(Data Model),Query,数据从Data Source加载到Data Model,默认情况下,Data Model和Data Source的表结构(Schema)相同,用户可以通过增加自定义列修改Data Model的结构。Query是Data Model的视图,默认情况下,Query和Data Model的表结构相同,用户可以通过增加计算列和度量列修改Query的结构。

1,自定义数据列

在Data View->Query Editor中,创建自定义数据列,使用的是M 公式(M formula ),M公式语言用于创建灵活性数据查询,M公式对大小写敏感。用户添加自定义数据列,这会修改数据模型(Data Model)的架构,PowerBI向Data Model中添加数据列。

例如,创建MonthKey列,通过使用M公式,把DateKey(格式是:yyyyMMdd)转换成MonthKey(格式是:yyyyMM)。

2,计算列(Calculated Column)

在Report View中,计算列用于从已经加载到数据模型(Model)中的数据,根据公式计算的数据列,这跟在Data Model中增加计算列是不同的,计算列是从数据模型中计算数据,不会修改数据模型,因此,计算列的值,只会出现在Report View 和Data View中。计算列使用DAX定义字段的数据值,基于加载到数据模型的数据和公式计算结果。

计算列的值是基于当前数据行,进行计算,每行有一个计算列的值。举个例子,显示最近一年的日期:

3,度量列(Measure)

度量值是在报表交互时对报表数据执行的聚合计算,度量值使用DAX定义字段的数据值,从数据模型中计算数据,不会修改数据模型,因此,度量值只会出现在Report View 和Data View中。度量值通常是用于聚合统计,基于用户选择的Filter,以显示不同的聚合值,由于度量值是聚合值,不是每行都有一个聚合值。举个例子,创建度量值 Answer Rate,其公式是:

Answer Rate = DISTINCTCOUNT(CloudThreads[AnsweredThreadID])/DISTINCTCOUNT(CloudThreads[ThreadID])

度量列能够引用其他表的数据列,根据数据模型中的关系,能够完成很多交互性的数据统计,非常强大,但是,也很绕、绕、绕……

二,报表可视化控件的设计

在显示报表数据时,PowerBI提供多种方式,能够对数据的显示进行微调,使数据显示的效果更合理。

1,层次结构( Hierarchy)

PowerBI 支持在Report View中创建字段的层次结构(Hierarchy),在同一个Query中,拖动一个字段到另一个字段下,PowerBI自动创建一个层次结构,并以父层次字段的名称命名,例如:

PowerBI内置一个可视化控件HierarchySlicer,能够显示字段的层次结构,在Fields中设置一个层次结构:

控件显示的结构是一个树形结构,点击“三角”,能够展开,以树形结构显示子级别的数据,HierarchySlicer支持逐层展开,如下图所示:

2,在Table控件中显示超链接(HyperLink)

在Product View中,选中Query的某一个字段,如下图,选中字段 ProfileLink,

Modeling菜单下,该字段的Data Type为Text,设置文本的Data Category为Web URL:

Table可视化控件的视图属性中,设置Values的URL Icon属性为On,

在Table控件中,Web URL的显示如下所示,点击LInk,能够直接打开浏览器,跳转到指定的网址:

3,数字的小数位的控制

可以在PowerBI中设置字段的数据类型,选中一个字段,打开Modeling菜单,

选择字段的数据类型,Format为 Decimal number,选择货币符号($), 显示百分比(%),千位分隔符(,),或小数位数(0-N),这里设置 显示的小数位数是1,只显示一位小数。

显示的效果如下,Score 保留一位小数点,并使用千位分割符号:

三,根据当前的数据导出数据

在数据建模时,需要创建两个表之间的关系,PowerBI要求跟关系相关的两个数据列,必须有一列是唯一值,不允许存在重复值。在DimCalendar表中,存在DateKey列,该列是以int表示的日期类型,例如,2017年10月1日,用DateKey表示是20171001,从DimCalendar表中导出MonthKey,公式是MonthKey=DateKey/100。需要根据MonthKey列新建一个Query,做法是:

1,添加Query

在查询编辑器(Query Editor)中,选中MonthKey,右击弹出快捷菜单,选择“Add as New Query”,

2,把List转换成Table

此时,新建的Query命名为MonthKey,是一个List类型,需要把List转换成Table,选中该List,打开主菜单Transform,点击“To table Convert”,把List转换成Table

从一个List创建Table,PowerBI需要用户选择界定符,该List没有任何界定符,选择None:

3,修改数据

新表的数据列名是Column1,右击弹出快捷菜单,点击“Rename”,把该列重命名为MonthKey,点击“Change Type”把该列的数据类型修改为“Whole Number”,点击“Remove Duplicates”,删除重复的数据值

4,查看导出数据表的实现步骤

在右侧的查询设置(Query Settings)中查看实现的步骤,选择某一个Step,点击Step 名称前的“×”,能够把该Step删除。

附:鉴于本人接触PowerBI的时间不长,知道的内容有限,后续有新的设计技巧,我会持续更新

参考文档:

Tutorial: Create calculated columns in Power BI Desktop

Tutorial: Create your own measures in Power BI Desktop

Power Query M Reference

Hyperlinks in tables

Measures in Power BI Desktop

Calculated columns in Power BI Desktop

时间: 2024-10-10 11:15:08

PowerBI开发 第三篇:报表设计技巧的相关文章

PowerBI开发 第八篇:查询参数

在PowerBI Desktop中,用户可以定义一个或多个查询参数(Query Parameter),通常的用法是通过查询参数定义数据查询(Query),在数据模型中创建关系,通过DAX表达式引用参数.在查询编辑器(Query Editor)中,用户通过菜单“Manage Parameters”创建和管理参数,参数有Name属性,参数的数据类型,以及参数的类型(List of Values,ListQuery),当前值(Current Value)等属性,用于手动枚举参数的值,或则指定一个Lis

PowerBI开发 第十篇:R 脚本

R是一种专门用于数据分析和统计的脚本语言,广泛应用在每一个需要统计和数据分析的领域.PowerBI支持R脚本,两者强强结合,使PowerBI的功能更加强大.PowerBI Desktop默认没有安装R,在使用R脚本之前,必须向PowerBI Desktop中安装R引擎.用户可以使用R脚本加载数据.对数据进行转换和处理.使用R脚本图形化显示数据,这意味着,PowerBI对R的支持是深度融合的,在数据处理的各个阶段都能使用R.而且,为了便于开发人员使用R进行编程,PowerBI可以直接调用R外部ID

(C/C++)基于SharpUI控件库的插件式框架开发--第三篇框架基础服务库

一个框架基础的东西,一般也是操作的最基础的类,比如char.int.bool等,有时出现内存泄露的问题导致错误的抛出,但是C++开发有的时候就算是抛出异常,那也是靠经验来积累才能非常快速准确的找出错误所在,这就需要在框架中需要添加日志管理的接口,日志管理的好处就是开发者自身在找异常时提供参考,另一个就是如果用户操作时出现问题,也可将日志反馈,帮助快速解决问题:总之了为了更好的扩展完善我的框架,我详细列一下这个基础服务库(XPCore)包含内容: 虽说sharpui控件库内封闭好string类,但

基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现

上两章节简要的讲解了SIP组件开发接口和开发环境的搭建.在本节将实现Linux 32平台的UAS和UAC,当然该UAS和UAC只实现了注册功能,并且是基于自主开发SIP组件libGBT28181SipComponent.so的,没有这个组件是运行不了的.其他功能在后续章节中讲解. 首先简单讲解一下GBT28181关于注册描述 一. GBT28181注册的流程如下图 电力系统注册稍微复杂点,但原来基本相同.多了个刷新注册的过程. 二.GBT28181关于注册的解释如下 三.SIP协议简介 一个合法

【Qt编程】基于Qt的词典开发系列<三>--界面美化设计

本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window  XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口中各种控件的特效也是特别重要的一环.下面讲讲我在词典软件中的一些设计:说到界面美化的设计,不得不提到美工,一个好的美工是想当的重要!软件毕竟少不了图标,而不懂美工的我,也就只能在网上使用别人的图标了. 如何得到网上的图标? 直接百度就可以了,当然还有另一种方法:就是从别人的文件中提取这些图标文件.

记开发个人图书收藏清单小程序开发(三)DB设计

主要是参考豆瓣的图书查询接口: https://api.douban.com/v2/book/isbn/:9780132350884 返回内容如下: 1 { 2 "rating": { 3 "max": 10, 4 "numRaters": 361, 5 "average": "8.8", 6 "min": 0 7 }, 8 "subtitle": "A H

API开发第三篇:PHP的设计模式之完美的单例模式

今天来说一说单例模式. 由于我以前是做java开发的,在使用单例模式的时候,首先想到的想用饿汉式,然后发现在PHP中,有这样一个特性:因为PHP不支持在类定义时给类的成员变量赋予非基本类型的值.如表达式,new操作等等.所以了饿汉式这个就不行了.转而想要确保这个单例模式的原子性,发现PHP中也没有像JAVA中的线程安全问题.嘿嘿,你说PHP好不好?那么OK接下来就试试PHP的懒汉式单例模式了. 先不说,我先上我第一个版本的单例模式代码: // 定义私有静态变量.此种方式为:懒汉式单例(PHP中只

Python开发第三篇

函数 一.函数参数传值 形参:函数在定义的时候给定的参数 实参:函数在运行时赋给的参数: 1 def func(i):#i为定义时的参数,为形参 2 pass 3 func(name)#name为运行时的参数,为实参,实参与形参的名字可以相同 传值方式: 位置传值:按照定义时的顺序,用实参给形参赋值 1 def func(x,y,z): 2 print("x->",x) 3 print("y->",y) 4 print("z->"

软件工程迭代开发第三篇

今天将之前的用户界面显示的内容集合到了一个函数中,并且增加了屏幕左上角的角色状态栏,并且加入了魔法这项状态.界面与下图所示: 因为还没有技能,所以魔法还不能减.这也是为之后加入技能做出准备.图中灰色的框是头像框,灰色方块是默认的头像. 整合代码如下: /*绘制UI界面*/ void Player::paintUI() { //计算用户界面的x,y值 double x, y; x = wx; y = wy; if (x < 1) x = 1; else if (x > mapmax - 1) x