一. M函数

M 函数是微软为 MicroSoft Power Query 设计的公式语言,简称 M 函数。
所以顾名思义,M 函数只能用在 Power Query 中。
M 函数和 Excel 中的函数相比,有下面几个优势:

❶ 数据处理能力更强。
Excel 的函数公式处理上万行数据的时候,就会出现明显的卡顿。
M 函数是基于 Power Query 的,Excel 中的数据需要先加载到 Power Query 中,数据处理能力倍增,处理几十万行的数据毫无压力。

❷ 数据计算方式更丰富。
普通的 Excel 函数,处理数据通常只有数据计算、文本处理、数据查询这几种方式。
而 M 函数基于 列表List、记录record、表Table 等对象,可以实现分组统计、透视列、逆透视、合并查询、拆分表格、表格结构重组等更多复杂的表格操作。


二. 三大容器

在这里插入图片描述

2.1 List列表

2.1.1 创建List列表

🔷以看作是Excel中的列,在PowerQuery中使用大括号 {}来表示列表。

= {1..10}
= {"0".."9"}
= {"元素1", "元素2", "元素3"}
= {"A".."Z", "a".."z", 1..10}
  • List列表中的元素可以是数字、字符串、列表、记录、表等。
= {"A",2,"贾飞天",#table({"姓名","年龄"},{{"小王",20},{"小李",24}}),[姓名="贾飞天",年龄=20],{0..9}}

在这里插入图片描述

2.1.2 合并多个List列表

  • 一个列表中的元素还是列表
= {{1,2},{2,3},{3,4},{4,5},{5,6}}

在这里插入图片描述

  • 通过List.Combine() 或者 & 的方式可以合并多个列表
= List.Combine({{1,2},{2,3},{3,4},{4,5},{5,6}})
= {1,2} & {2,3} & {3,4} & {4,5} & {5,6}

在这里插入图片描述

2.1.3 获取List列表中的元素

  • 通过{下标}的方式获取列表元素
= {1..5}{0}  // 1
= {0,1,2,3,4,5}{3}  // 3
  • 通过?可以防止下标越界的时候报错
= {1..5}{100}?  // null

2.2 Record记录

2.2.1 创建Record记录

🔷记录Record:

  • 相当于Excel中的行,在PowerQuery中使用中括号 [] 来表示记录。由字段名和值构成。
  • Record记录 相当于其他编程语言中的字典
  • 语法:[字段名1=值,字段名2=值,…]
= [姓名 = "张三",性别 = "男",年龄=28]

在这里插入图片描述

  • 列表中的元素是Record记录
={[姓名 = "张三"],[性别 = "男"],[年龄=28]}

在这里插入图片描述

2.2.2 合并多个Record记录

  • 通过Record.Combine() 或者 & 的方式可以合并多个Record记录
= Record.Combine({[姓名 = "张三"],[性别 = "男"],[年龄=28]})
= [姓名 = "张三"] & [性别 = "男"] & [年龄=28]

在这里插入图片描述

2.2.3 获取Record记录中的值

  • 通过[key]的方式获取Record记录中的值
= [姓名 = "张三",性别 = "男",年龄=28][姓名]

在这里插入图片描述

2.3 Table表

2.3.1 创建Table表

🔷Table表:

  • 由列表和记录构成,表一般都是从外部导入的。
  • 如果想在PowerQuery中手工创建的话:
    • 每组列表list中的元素必须与字段数量相等
    • 顺序也必须一致
= #table({"姓名","年龄"},{{"杨过",17},{"小龙女",20}})

在这里插入图片描述

2.3.2 合并多个Table表

=1 &2 &3
= #table({"姓名","年龄"},{{"杨过",17},{"小龙女",20}}) & #table({"姓名","年龄"},{{"张三",17},{"李四",20}}) & #table({"姓名","年龄"},{{"王五",17},{"赵六",20}})

在这里插入图片描述

2.3.3 获取Table表中的值

🔷先创建一个表,命名为表1

= #table({"姓名","年龄"},{{"杨过",17},{"小龙女",20},{"张三", 18}})

在这里插入图片描述

  • 获取姓名列

在这里插入图片描述

  • 获取表的第一行

在这里插入图片描述

  • 获取表第一行中的姓名
=1[姓名]{0}
=1{0}[姓名]

在这里插入图片描述

2.3.4 精准获取

  • 精准获取可以避免之后数据行被删除之后,下标变动的问题。
=1{[姓名="杨过"]}

在这里插入图片描述

=1{[姓名="杨过"]}[年龄]

在这里插入图片描述


三. 容器之间的转换

3.1 List列表转换为Record记录

= Record.FromList(
    {"姓名","年龄","地址"},
    {"贾飞天",Text.From(20),"地球"}
)

在这里插入图片描述

3.2 Record记录转换为Table表

= Table.FromRecords({
    [姓名 = "张三", 年龄 = 20],
    [姓名 = "李四", 年龄 = 18],
    [姓名 = "王五", 年龄 = 21],
    [姓名 = "赵六", 年龄 =22]
})

在这里插入图片描述

3.3 Table表转换为Record记录

3.3.1 只有2列的表

在这里插入图片描述

🔷先把列表修改为NameValue

= Table.RenameColumns(1, {{"姓名","Name"},{"年龄","Value"}})

在这里插入图片描述

🔷再将表转换为Record记录

= Record.FromTable(改名)

在这里插入图片描述

🔷也可以使用let in表达式,一步到位

let
    改名 = Table.RenameColumns(, {{"姓名","Name"},{"年龄","Value"}}),
    结果 = Record.FromTable(改名)
in
    结果

3.3.2 有2列以上的表

3.3.2.1 Table.ToRecords()

在这里插入图片描述

  • 转换之后,得到的是一个List,List中的每一个元素是Record记录
= Table.ToRecords(1)

在这里插入图片描述

3.3.2.2 Record.FromList()
= Record.FromList(值列表, 字段名列表)

在这里插入图片描述

更多推荐