M语言函数分类解析!列表、记录、表函数应用
还在用笨办法一个个单元格处理数据?Excel内置的Power Query M语言,让你一键搞定复杂清洗,效率翻倍!今天不讲虚的,直接带你拆解M语言三大核心数据类型(列表、记录、表)的专属函数,看完你就能用它们解决实际办公难题,从此告别重复劳动!
本文你将学到:
-
列表(List): 批量操作的“流水线工人”
-
记录(Record): 数据行的“身份证”
-
表(Table): 整体处理的“指挥官”
-
三大类型协同作战
-
从函数到思维:构建你的数据流水线
一、 列表(List):你的批量操作“流水线工人”
办公场景: 领导丢给你一份2025年全年12个月的销售数据表,让你快速算出每个月的平均销售额。难道要手动拉12次公式?
传统做法: 插入12个新列,分别用AVERAGE函数计算,繁琐易错。
M语言解法: 把一列数据看作一个“列表”,用列表函数一键搞定。
核心M代码:
// 假设“销售额”这一列数据已经加载到Power Query
月均销售额 = List.Average(源[销售额])
// 更进阶:一次性计算多列的平均值
多列平均 = List.Transform(
{源[销售额], 源[成本]},
each List.Average(_))
公式原理解析:
-
源[销售额]:在M语言中,用中括号[]引用列名,整列数据被自动视为一个“列表”(List)。 -
List.Average:这是“列表”类的函数。它的工作逻辑是:接收一个列表(比如一列数字),然后像流水线工人一样,自动遍历列表里的所有元素,并计算出平均值。 -
List.Transform:这是“转换”函数。它接收一个列表和一个转换规则(each List.Average(_)),然后对列表里的每一项(这里每个项本身又是一个列表)应用这个规则,输出一个新的结果列表。
一句话总结: 把列当“列表”,用List.开头的函数,就是给整列数据下集体命令,效率自然高。
二、 记录(Record):每一行数据的“身份证”
办公场景: 你需要从几百人的花名册里,快速提取出“张三”的部门和手机号。用VLOOKUP?如果数据顺序变了呢?
传统痛点: VLOOKUP依赖列位置,数据列顺序一变,公式就报错。
M语言解法: 把每一行数据看作一个“记录”(Record),用记录查找运算符精准定位。
核心M代码:
// 方法1:使用记录查找运算符 []
查找张三信息 = Table.SelectRows(源, each [姓名] = "张三"){0}
张三部门 = 查找张三信息[部门]
张三电话 = 查找张三信息[手机号]
// 方法2:使用Record.Field函数
单条记录 = Table.First(Table.SelectRows(源, each [姓名] = "张三"))
获取部门 = Record.Field(单条记录, "部门")
公式原理解析:
-
•
Table.SelectRows(...){0}:Table.SelectRows函数筛选出所有姓名为“张三”的行,结果是一个表。后面的{0}是列表索引运算符,表示取出这个结果表中的第一行(M语言行号从0开始)。这第一行就是一个“记录”。 -
•
记录[字段名]:这是记录查找运算符。拿到一个记录后,用中括号[]加上字段名(列名),就能像查身份证一样,精准提取出该字段的值,完全不受列在表中位置的影响。 -
•
Record.Field:这是记录类的标准函数,功能与记录[字段名]相同,但以函数形式呈现,更适合在复杂公式中动态指定字段名。
一句话总结: 把行当“记录”,用[]或Record.函数,就能实现按“名”索骥,数据怎么摆都不怕。
三、 表(Table):运筹帷幄的“数据指挥官”
办公场景: 各部门提交的2025年预算格式五花八门,你需要快速合并、去重、并筛选出超预算的项目。
传统噩梦: 复制粘贴到手抽筋,还容易漏掉重复项。
M语言解法: 在Power Query里,所有数据最终都是一个“表”(Table)。用表函数对整个数据集发号施令。
核心M代码:
// 1. 合并多个结构相同的表(如各分公司报表)
合并表 = Table.Combine({表1, 表2, 表3})
// 2. 按“项目编号”删除重复行
去重表 = Table.Distinct(源, {"项目编号"})
// 3. 筛选出“实际金额”大于“预算金额”的行
超预算项目 = Table.SelectRows(源, each [实际金额] > [预算金额])
// 4. 分组统计各部门总预算
部门预算汇总 = Table.Group(源, "部门", {{"总预算", each List.Sum([预算金额]), type number}})
公式原理解析:
-
•
Table.Combine:表合并函数。它接收一个由多个表组成的列表,然后将它们上下堆叠在一起,是合并多张报表的神器。 -
•
Table.Distinct:表去重函数。你可以指定依据哪些列进行去重,它就像一位细心的指挥官,帮你清除完全重复的行。 -
•
Table.SelectRows:表行筛选函数。参数each [实际金额] > [预算金额]是一个条件判断,函数会检查表中的每一行(记录),只保留符合条件的行。 -
•
Table.Group:表分组聚合函数。它先按“部门”分组,然后对每个组内的“预算金额”列执行List.Sum求和操作,最后生成一个包含“部门”和“总预算”两列的新表。这实现了类似数据透视表的分组求和,但步骤被记录在查询中,可一键刷新。
一句话总结: Table.开头的函数是面向整个数据集的“统帅”,让你用一句指令完成合并、清洗、筛选、分组等复杂操作。
四、 协同作战:列表、记录、表的“组合技”
办公场景: 你需要生成一份2025年员工考核简报,为每个人计算其得分超过部门平均分的项目数量。
单一类型函数搞不定? 需要让列表、记录、表函数联手。
M语言组合技:
let 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
// 第一步:用Table.Group计算每个部门的平均分
部门平均分表 = Table.Group(源, "部门", {{"部门平均分", each List.Average([项目得分]), type number}}),
// 第二步:将部门平均分“合并”回原表,以便逐行比较
合并表 = Table.NestedJoin(源, {"部门"}, 部门平均分表, {"部门"}, "部门平均分", JoinKind.LeftOuter),
展开表 = Table.ExpandTableColumn(合并表, "部门平均分", {"部门平均分"}, {"部门平均分"}),
// 第三步:对每一行(记录),判断其项目得分是否大于所属部门平均分
添加判断列 = Table.AddColumn(展开表, "是否超标", each if [项目得分] > [部门平均分] then 1 else 0),
// 第四步:按员工分组,用List.Sum对其“是否超标”列表求和
最终结果 = Table.Group(添加判断列, "员工姓名", {{"超标项目数", each List.Sum([是否超标]), type number}})in
最终结果
组合原理解析:
这个例子完美展示了三大类型的协作流程:
-
表函数开局:
Table.Group对源表进行第一次聚合,生成一个“部门平均分”表。 -
表函数连接:
Table.NestedJoin和Table.ExpandTableColumn将平均分表的信息匹配回原始明细表。 -
记录级处理:
Table.AddColumn中的each if...对每一行记录进行逻辑判断。 -
列表函数收尾:第二个
Table.Group中,each List.Sum([是否超标])是对每个员工分组下的“是否超标”列表进行求和。
一句话总结: M语言的强大,在于让“表”整体规划、“记录”精细操作、“列表”批量计算三者无缝衔接,形成一条自动化的数据流水线。
五、 思维升级:从学函数到建“数据流水线”
看完上面这些例子,你是否发现,学习M语言的关键不是死记硬背几百个函数,而是掌握一种新的数据处理思维:
-
化整为零,再化零为整:面对杂乱数据,先用
Table.函数进行整体清洗、合并、转换(化整为零);然后用List.和Record.思维在列和行级别进行精确计算;最后再用Table.函数将结果组织成你需要的新表(化零为整)。 -
让步骤可追溯、可重复:你在Power Query编辑器里每一步操作,都会生成对应的M代码。这意味着你的整个数据处理流程被完整记录了下来。下次数据更新,你只需点击“刷新”,所有步骤都会自动重跑一遍。这才是真正的“一劳永逸”。