【Power BI】精要 之 Power Query

  Power Query 最重要的就是M函数编写,M函数是Power Query的函数语法,可以帮助我们灵活地完成数据导入、整合、加工处理等数据处理工作。M函数占据了Query数据处理能力的80%,界面操作仅仅占20%。

数据类型

  先介绍一下M函数的基本表达式:let…in…。单行注释符为‘//’,多行注释符为‘/……/’。例:

let   //let用于封装计算结果, 并为计算结果命名。
Source = Text.Proper("hello world")
in    //in用于显示结果。
Source
/*通过let语句将Text.Proper(“hello world”)函数的计算结果封装到名叫Source的变量中,
 再通过in语句显示Source变量的内容“hello world” 。*/

  再介绍M函数基本变量类型:

类型 EG.Value
Type Example value
Binary 00 00 00 02 // number of points (2)
Date 5/23/2015
DateTime 5/23/2015 12:00:00 AM
DateTimeZone 5/23/2015 12:00:00 AM -08:00
Duration 15:35:00
Logical true and false
Null null
Number 0, 1, -1, 1.5, and 2.3e-5
Text “abc”
Time 12:34:12 PM

  除了Power Query指定的内置函数,Power Query 用户还可以自定义函数。这里业介绍一下Power Query 的自定义函数。自定义函数:函数名 = (参数1,参数2,参数3……) => 函数运算表达式**※通过调用函数得到的函数返回值称为函数值**。例:

//自定义“MyFunction”函数
let
MyFunction = (parameter1, parameter2) => (parameter1 + parameter2) / 2
Final = MyFunction(2,4)
in
Final
/*以上代码执行结果为3,先在let中创建名为MyFunction的自定义函数,函数有parameter1和parameter2两个参数,
函数的运算表达式为(parameter1 +parameter2) / 2,之后在let中使用2与4两个参数调用MyFunction函数, 
MyFunction函数将运算结果返回给变量Final,最后在in中显示Final变量的内容3。*/

数据结构

  Power Query里的数据是非关系型数据,是结构化数据,包含:列表(List)、记录(Record)、表(Table)。先说列表(List):列表是扩在花括号中的一组数据,列表中每个数据都有属于自己的序号以便自己能够被检索到,列表中的数据序号从0开始按照排列顺序依次整数递增,大列表内还可以嵌套子列表、记录等。花括号除了用来括起列表内的所有数据还用来指定列表内数据的序号,通过指定数据序号可以从列表内找到并获取所需的数据值。
在这里插入图片描述
  Power Query记录用来定义字段和给字段赋值,一个字段由字段名以及字段内的值组成,字段名是唯一
的文本值,是字段的标识符。字段名可以不用引号引用,字段名有两种表达形式:

不加"“的表达形式、例如OrderID
加#和”"的表达形式、例如#“Today’s data is:”
记录中的内容写在[]括号内, []括号同样用于在记录中取特定字段的值。
在这里插入图片描述

  表(Table是由行列数据构成的,可以使用隐式或显示方式定义字段(列)的数据类型。使用#table建表时,可以使用列表或者记录来定义列名,并使用嵌套列表来定义表中的数据,嵌套列表的大列表内包含所有定义单行用的子列表,而每个子列表则用来定义一行数据。花括号{}可以用来索引查找指定行的数据。

在这里插入图片描述
在这里插入图片描述
其他的数据结构在这里插入图片描述

  另外,再说一说if表达式。它通过对逻辑条件进行判断来对两个表达式进行选择。语法结构:

if 2 > 1 then
2 + 2
else
1 + 1
/*在上述案例中,因为判断条件2>1的逻辑值为真,所以执行
第一个表达式2+2,所以执行结果为4,如果判断条件改为
2<1,则其判断条件的逻辑值为假,所以会执行第二个表达
式1+1,此时的执行结果为2.*/

M函数的计算方式及运算符

计算方式
  M函数的计算方式与Excel单元格相互间引用计算的方式类似,其计算顺序是根据计算单元中每个元素间的依赖关系决定的。例如类似下边Excel单元格间的相互引用计算方式1:

在这里插入图片描述
在M函数中便可以写成如下形式,它与Excel单元格的区别在于M函数中的A1、 A2、 A3是记录
中的元素,而Excel中的A1、 A2、 A3是单元格地址。
在这里插入图片描述

扫描二维码关注公众号,回复: 10309056 查看本文章

  在M函数中还可以进行更为复杂的元素间的引用计算。例如下边例子中的#"Total Sales"就是引用同一个记录中嵌套的列表内的第一个记录内的Total字段,以及第二个记录内的Total字段,将这两个值相加得到的。计算方式2:

在这里插入图片描述

运算符
  一个完整的计算表达式由计算数与运算符两部分组成,例如在计算表达式1+2中, 1和2是计算数而+就是运算符。 M函数中运算符的含义有时取决于参与计算的计算数的数据类型,下边是主要运算符的案例列表供大家参考。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

数据类型转换、错误处理

数值类型

在这里插入图片描述

文本类型

在这里插入图片描述

逻辑类型

在这里插入图片描述

日期、时间、日期时间以及时区类型

在这里插入图片描述

错误处理

  在M函数中, 当某个表达式无法得到正确的计算结果时我们可以用“error” 来发生错误事件。用“error” 发生的错误事件可以用“Try” 表达式来获取, 并对其进行处理及显示详细错误信息。
  “Try” 表达式可以将由error发生的错误信息封装在一个记录内。EG:

try error "negative unit count"
/*上例会生成一个由[HasError]、 [Error]以及[Meesage]三个字段构成的
记录, 字段中的值用来对错误进行解释说明。*/

  一般情况下上述案例中, “Try” 表达式执行后产生的记录内容如下:(但也可以使用“otherwise” 运算符来重新定义Try的显示结果。try error "negative unit count" otherwise 42 // equals 42)

[
HasError = true,
Error =
[
Reason = "Expression.Error",
Message = "negative unit count",
Detail = null
]
]

  Try的实际应用案例:

let Sales =
[
ProductName = "Fishing rod",
Revenue = 2000,
Units = 1000,
UnitPrice = if Units = 0 then error "No Units"
else Revenue / Units
],
textUnitPrice = try Number.ToText(Sales[UnitPrice]),
Label = "Unit Price: " &
(if textUnitPrice[HasError] then textUnitPrice[Error][Message]
else textUnitPrice[Value])
in
Label
/*执行结果为"Unit Price: 2",若将Sales记录中的Units改为0,则显示结果为"Unit Price: No Units"。*/

  上面从数据类型、结构,M函数计算方式和运算符,数据类型转换、错误处理等方面介绍了 Power Query的重点内容。通过掌握上面的要点,多练习,便能更好的掌握 Power Query,提高 Power Query数据处理能力。

发布了39 篇原创文章 · 获赞 42 · 访问量 4875

猜你喜欢

转载自blog.csdn.net/weixin_41774099/article/details/97420581