Power Query M函数与3大容器
·
一. 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列的表

🔷先把列表修改为Name和Value
= 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(值列表, 字段名列表)

更多推荐
所有评论(0)