目录
1、Power BI数据分析来了,您准备好了吗?
2、数据分析语言DAX(优雅简洁的数据分析语言)
3、Power BI数据源导入(数据表格准备)
4、数据分析之计算列(数据分析的辅助神器)
5、数据分析之度量值(数据分析的主力神器)
6、计算列与度量值区别(DAX公式写法选择)
7、计算列与度量值数据类型(规范数据类型)
8、运算符详解(DAX公式必会基础)
9、表、列、度量值的引用(规范公式编写规则)
10、DAX公式格式化与注释(让公式更具可读性)
11、条件分支函数IF(甄别是非的利器)
12、条件分支函数SWITCH(升级版IF函数)
13、多表关系设置(初识数据建模)
14、多表关系设置进阶(数据建模进阶)
15、变量的应用(加快数据处理的法宝)
(1)Power BI安装,可以下载安装,也可以在微软应用商店安装。
(2)Power Query-M语言,数据清洗。参考课程:《Power BI商业智能分析教程--数据清洗》
(3)Power Pivot-DAX语言,数据分析。
定义:又名超级数据透视表,PowerPivot是数据透视表的强大“后台”,存在于Excel和Power BI中,以结构化的方式来存储数据,利用计算公式,为报表和可视化图表提供丰富的分析维度和度量。
使用Power Pivot可以汇聚来自各种来源的数据,允许您执行强大的数据分析和创建复杂的数据模型。
作用:数据分析。
优点:更强大的数据分析能力,更强的性能处理。PowerPivot通过使用其内存中的引擎和高效的压缩算法,能以极高的性能处理大型数据集。
那什么是DAX呢?在Power Piovt中完成的所有数据分析都是使用的公式完成的。这种公式就叫DAX公式。
友情提示:
Power Pivot主要功能是做数据分析,千万不要混淆用做数据清洗。如需数据清洗,请先在Power Query中完成,然后再导入到Power Pivot做后续的数据处理。
什么是DAX?DAX公式始终以等号(=)开头。在等号后,可提供计算为标量的任何表达式,也可提供能转换为标量的表达式。
一、编写DAX公式的位置:
(1)新建表
(2)新建列
(2)度量值
二、DAX公式的应用场景:
(1)DAX在Power BI中的应用
(2)DAX在Excel中的应用
一、从Power Query中加载表格
(1)导入文件
(2)手工输入
二、在Power BI中创建表格
(1)手工输入
(2)函数生成
计算列,相当于给表格加添列,属于行上下文计算。计算列占用模型加载时间,计算结果占用内存。以下是计算列的几种应用场景:
(1)做聚合时的值(不推荐)
(2)做筛选器分类(推荐)
(3)在报表行、列中做筛选(推荐)
度量值,返回结果一定是个标量值(单值),而不能是列或者表格。度量有测量、计量之意。度量值会受环境影响,所写DAX公式会在不同计值环境中计量出不同结果。度量值只是在查询时才计算(消耗CUP),不占用内存与磁盘空间。下面学习一下度量值在不同报表形态下的运算:
(1)一维表中的度量值
(2)二维表中的度量值
(3)图表中的度量值
(4)切片器下的度量值
如果其他人发送一条DAX公式给您?如何区分是计算列公式,还是度量值公式呢?这里约定俗成的方法是:
计算列公式:列名=DAX公式
度量值公式:度量值名:= DAX公式
在Excel中必须这样区分,但在Power BI中可以直接输入“=”开始。在Power BI中也可以通过图标区分,计算列用表示,度量值用表示。
有的数据分析需求使用计算列和度量值都能完成,但还有一些偏向设置。
适用于计算列的情况有:
(1)计算结果用于切片器、矩阵的行列区等具有筛选性质的场景。
(2)对文本或数字分类,比如“优良中差”等级分类,分数、业绩等数字的分类划分。
适用于度量值的情况有:
(1)做聚合运算
(2)能用度量值的尽量不用计算列(如单价*数量)
数据类型的确认是在对表做数据分析前非常重要的一项工作。在Power BI中的表格列和度量值都可以设置数据类型。
整数:DAX数据类型只有64位整数,所有整数值之间的内部计算都是使用64位整数。
十进制:十进制数总是以双精度浮点值的形式存储。
定点小数:定点小数分隔符的位置是固定的,小数分隔符右侧始终有四位数。
日期/时间:表示日期和时间值
日期:仅表示日期(没有时间部分)
时间:仅表示时间(没有日期部分)
文本:Unicode字符数据字符串。可以是字符串、数字或文本格式表示的日期。
True/False:为True或False 的布尔值。
二进制:二进制数据类型用于在数据模型中存储图像。DAX中无法使用。历史原因还暂时存在。
在编写DAX公式时,运算符也是要必须掌握的,下表列出了常用运算符:
运算符类型 |
符号 |
用法 |
返回值 |
小括号 |
( ) |
改变计算优先级 |
不定 |
算术运算符 |
+ |
加 |
返回数字 |
- |
减 |
||
* |
乘 |
||
/ |
除 |
||
文本连接符 |
& |
文本连接符 |
返回文本 |
比较运算符 |
= |
等于 |
返回布尔值 |
<> |
不等于 |
||
> |
大于 |
||
>= |
大于等于 |
||
< |
小于 |
||
<= |
小于等于 |
||
逻辑运算符 |
&& |
逻辑与 |
|
|| |
逻辑或 |
||
IN |
包含判断 |
||
NOT |
否定判断 |
在编写DAX公式时,除了会使用各种运算符、函数、各种标量值之外,有需要引入表、列、度量值这3种重要的元素。
引用元素 |
建议写法 |
不建议写法 |
示例 |
引用表 |
'表名' |
=COUNTROWS('销售表') |
|
引用列 |
'表名'[列名] |
[列名] |
=SUM('销售表'[数量]) |
引用度量值 |
[度量值] |
'表名'[度量值] |
= SUMX('销售表','销售表'[数量]*[单价]) |
在上面的写法中,要关键区分引用列与度量值。原因如下:
(1)引用列时建议写带上表名的原因在于,在生产环境中,分析涉及到的表可能有多个,多个表之间可能有相同列名,如果不带上表名,可能无法识别。
(2)引用度量值时,如果带上表名,可能无法区分引用的是列,还是度量值。
两个温馨提示:
(1)在编写DAX公式时,如果要引用表、列,最好在函数的参数中编写,这样具过滤功能,可以将无关的引用对象排除。
(2)当编写的度量值比较多时,可以统一创建在一个表中。
比较简短的DAX公式可以写成一行,长的DAX公式也可以写成一行,可读性太差。需要格式化。最好的办法是格化成多行显示。换行使用ALT+ENTER键,格式化DAX公式最主要是格式化函数,的要求如下:
(1)函数名与左括在一行
(2)每个参数独占一行
(3)反括号占一行
(4)函数名与反括号对齐
(5)参数要缩进
比如对SUMX函数格式化:
DAX公式 =
SUMX(
'销售表',
'销售表'[数量]*'销售表'[单价]
)
格化式DAX公式只是第1步,如果希望可读性更强,加上注释更好。注释分为单行注释与多行注释。单行注释符号为“--”或者“//”;多行注释符号为“/*”开头,“*/”结束。
以下是单行注释各位置的写法:
DAX公式 =
//迭代聚合函数应用
--根据数量与单价计算金额
SUMX(
'销售表',--提供表格
'销售表'[数量]*'销售表'[单价] //金额计算
)
以下是多行注释各位置的写法:
DAX公式 =
/*多行注释第1行
多行注释第2行
……
*/
SUMX(
/*这是一个迭代器函数
这是求和函数
*/
'销售表',
/*提供求和的表
提供的为表格对象
*/
'销售表'[数量]*'销售表'[单价]
/*计算金额
提供数量与单价
*/
)
IF函数相信已不再陌生,无论是在Excel中,还是在大多数编程语言中都有关于if的函数或者是语句,在DAX中同样也提供了if函数,主要是以下三种书写方法:
(1)IF两个参数写法
if2 =IF(7>1,"YES","NO")
(2)IF三个参数写法
(3)IF嵌套写法
为什么说SWITCH函数是IF函数的升级版?原因在于写书方式更科学,从参数结构层面看起来更舒服。SWITCH函数的书写方式有以下两种:
第1种,根据不同的值返回不同结果。
SWITCH ( <表达式>, <值1>, <结果1>, [<值2>, <结果2>, … ], [<备选结果>] )
switch1 =
SWITCH("c",
"a",10,
"b",20,
"c",30,
100
)
第2种,根据不同的判断返回不同结果。
SWITCH ( True(), <判断1>, <结果1>, [<判断2>, <结果2>, … ], [<备选结果>] )
switch2 =
var Score=51
return
SWITCH(
TRUE(),
Score>=90,"优",
Score>=80,"良",
Score>=60,"中",
"差"
)
在本课之前讲解的全是对单表的操作,从本节课开始,可能更多是多表之间的数据分析。在进行多表分析前,要将表与表之间建立关系。各表之间有了关联,也就具有数据传递性,这就是数据建模。
在下图中有“产品表”和“销售表”,我们以产品为连接键将这两表做关联,然后以“产品表”中的“类别”为依据对“销售表”中的“数量”求和。
最后汇总结果如下(以表格和图表两种方式呈现),接下来分析一下数据是如何完成传递的,又是如何执行的聚合计算的。
无论数据模型多复杂,最科学的关系联结方式是一对多(一端对多端)。因此,我们在建模时最好保持一对多的建模方式。
我们再从另外的角度谈谈这两个表,实际很多时候,我们称“销售表”为实事表,称“产品表”为维度表。
事实表:事实表是数据分析的核心表格,描述业务特定事件的数据。
维度表:就是分析事实表的角度,是从事实表中抽离出来的分析粒度。
前面我们讲解的数据模型是比较简单。本课我们加大难度。如下图所示,分别准备了“类别表”、“产品表”、“部门表”、“员工表”、“销售表”。从整个数据模型在看,“销售表”是事实表,除此之外全是维度表。现在已经建立好关系。
对应各表的关联设置,数据从一端到多端做数据沿袭传递。
变量,就是将数据存储在一段内存中,然后将这段内存贴个标签,这个标签就是变量。变量如果没有使用,是不会计算的,一旦被使用参与计算赋值后,就不会再重新计算。变量的值可以是单值、表格、列表。
使用变量有三个优点。
第1,代码可读性。使用变量,能让DAX公式看起来更优雅、简洁。可读性更强强。
第2,代码复用性。如果会多次使用一个公式,可以将其定义名变量。
第3,代码性能更高。DAX中的变量执行的是惰性计算。第1次计算出结果后,当再次调变量时,则不会再运算公式,而是直接使用第1次讲算的结果。
下面学习一下变量的书写方法,如下代码所示,定义方式是var…return… var后面是定义变量,可以定义多个。return后是返回结果,可以是变量名,也可以是DAX公式。
变量定义在独立行中,如下金额1度量值所示:
金额1: =
var price=AVERAGE('销售表'[单价])
var total=
SUMX(
'销售表',
'销售表'[数量]*price
)
return
total
求和1 =
var avgs=AVERAGE('销售表'[单价])
var sums=SUMX(
'销售表',
'销售表'[数量]*avgs
)
return
sums
变量定义在函数参数中,如下金额2度量值所示:
金额2: =
SUMX(
'销售表',
var price=AVERAGE('销售表'[单价])
var total='销售表'[数量]*price
return
total
)
求和2 =
SUMX(
'销售表',
var avgs=AVERAGE('销售表'[单价])
var moy='销售表'[数量]*avgs
return
moy
)