M语言函数分类解析!列表、记录、表函数应用

office

还在用笨办法一个个单元格处理数据?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    

最终结果

组合原理解析:
这个例子完美展示了三大类型的协作流程:

  1.  表函数开局:Table.Group对源表进行第一次聚合,生成一个“部门平均分”表。

  2. 表函数连接:Table.NestedJoin和Table.ExpandTableColumn将平均分表的信息匹配回原始明细表。

  3. 记录级处理:Table.AddColumn中的each if...对每一行记录进行逻辑判断。

  4. 列表函数收尾:第二个Table.Group中,each List.Sum([是否超标])是对每个员工分组下的“是否超标”列表进行求和。

一句话总结: M语言的强大,在于让“表”整体规划、“记录”精细操作、“列表”批量计算三者无缝衔接,形成一条自动化的数据流水线。

五、 思维升级:从学函数到建“数据流水线”

看完上面这些例子,你是否发现,学习M语言的关键不是死记硬背几百个函数,而是掌握一种新的数据处理思维:

  1.  化整为零,再化零为整:面对杂乱数据,先用Table.函数进行整体清洗、合并、转换(化整为零);然后用List.和Record.思维在列和行级别进行精确计算;最后再用Table.函数将结果组织成你需要的新表(化零为整)。

  2. 让步骤可追溯、可重复:你在Power Query编辑器里每一步操作,都会生成对应的M代码。这意味着你的整个数据处理流程被完整记录了下来。下次数据更新,你只需点击“刷新”,所有步骤都会自动重跑一遍。这才是真正的“一劳永逸”。