文 / 老汪(汽车零部件财务与商业智能实战派)
“老汪,我明明在 Power Query 里加了两个排序条件,先排车间,再排超支金额降序,怎么第二列的金额不是从上到下整体递减的?PQ 是不是出 bug 了?”
月末核算成本关账时,新来的成本会计小张急匆匆地跑来找我。很多初涉 Excel BI 的财务人员,常被这个多列排序的判定逻辑绕晕。今天老汪就带大家用最白话的语言,把Table.Sort这个高频函数彻底拆透!
一、 为什么老汪说“掌握 Table.Sort,才算真正玩转表级清洗”?
在前面的课程里,老汪带大家拆解了 List.Sort。List.Sort 针对的是单列数据或内存级 Record 列表,而在真实的财务与生产报表清洗中,我们面对的 95% 以上都是标准的二维数据表(Table)。
整张二维表的排序,核心函数就是 Table.Sort。
1. 函数基本语法拆解
Table.Sort(table as table, comparisonCriteria as any) as table
- 第 1 参数(table):你要操作的源表格;
- 第 2 参数(comparisonCriteria):排序规则。它可以是一个简单的列名、一个带排序方向的小列表,也可以是由多个条件嵌套而成的大列表。
2. 三大核心排序姿势(老汪敲黑板)
① 单列默认升序(最简写法)
如果只对某一列升序排列,直接传入列名字符串即可:
Table.Sort(源, "生产车间")
② 单列降序排列
如果需要降序,就必须套上双层大括号,或者使用 Order.Descending(在 M 语言里也可以直接写数字 1 代表降序,0 代表升序):
// 标准规范写法(推荐,代码可读性极高)
Table.Sort(源, {{"制费超支差异额(元)", Order.Descending}})
// 老法师极简速记写法(1代表降序,0代表升序)
Table.Sort(源, {{"制费超支差异额(元)", 1}})
③ 多列复合排序(多条件主次权重,最核心实战!)
当需要“先按车间归类(升序),同一车间内部再抓超支大头(降序)”时,外层套一个大列表 {},内层依次放入每一个排序条件的规则列表:
Table.Sort(源, {
{"生产车间", Order.Ascending},
{"制费超支差异额(元)", Order.Descending}
})
二、 走进车间:汽车零部件月末工单制费超支现场
在老汪服务的一家汽车底盘与动力总成零部件制造企业(Tier 1)里,CNC 机加车间、高压精密压铸车间和冲压焊接车间都在开足马力为各主机厂赶制核心部件。
月末成本会计从 ERP 系统中导出了《月末工单制费超支台账表》(大家可在文末下载随堂 Excel 课件跟老汪同步动手):
| 工单编号 | 生产车间 | 配套核心零部件 | 主机厂客户 | 完工状态 | 计划工单量(件) | 实际完工量(件) | 制费超支差异额(元) |
|---|---|---|---|---|---|---|---|
| WO-202611-01 | CNC机加一车间 | 铝合金底盘下控制臂 | 比亚迪海豹 | 进行中 | 5,000 | 4,800 | 18,500.00 |
| WO-202611-02 | 高压压铸车间 | 轻量化通风制动盘 | 特斯拉Model Y | 已完工 | 8,000 | 8,000 | -3,200.00 |
| WO-202611-03 | 冲压焊接车间 | 电池包下壳体托盘 | 吉利极氪001 | 延期停滞 | 3,000 | 1,200 | 46,000.00 |
| WO-202611-04 | CNC机加一车间 | 双活塞制动卡钳体 | 蔚来ES6总成 | 进行中 | 4,000 | 3,900 | 12,000.00 |
| WO-202611-05 | 高压压铸车间 | 驱动电机前置端盖 | 小鹏G6三电 | 延期停滞 | 6,000 | 4,500 | 35,000.00 |
| WO-202611-06 | 冲压焊接车间 | 前悬架高强副车架 | 理想L7底盘 | 进行中 | 3,500 | 3,100 | 15,000.00 |
| WO-202611-07 | CNC机加一车间 | 转向节转向节臂管 | 广汽埃安Hyper | 已完工 | 6,000 | 6,000 | -1,500.00 |
| WO-202611-08 | 高压压铸车间 | 双腔减震塔铸铝支架 | 小米SU7总成 | 进行中 | 4,500 | 4,100 | 18,500.00 |
💡 移动端体验小贴士:上面这张包含 8 个业务字段的明细大表,在手机端已配置左右平滑横向滑动容器,手指轻划即可完整查看每一列数据,排版舒展不挤压变形!
三、 白话破除误区:多列排序到底是怎么判定的?
这就是文章开头小张产生的疑问:“为什么排了第二列【制费超支差异额】,金额这一列却不是从大到小一路排到底?”
老汪用一句话给你拆穿真相:
多列排序是“主次分层优先级”判定,绝不是把整张表各列拆散了各自独立排!
🎯 老法师的比方:高考录取与并列仲裁
- 第一排序条件是“决定性门槛”:系统首先严格按照第 1 个条件(【生产车间】)进行升序排列。所有属于
CNC机加一车间的工单聚在一起,属于冲压焊接车间的聚在一起,属于高压压铸车间的聚在一起。 - 第二排序条件是“同组内部仲裁”:只有在第一条件完全相同(即同在某一个车间内部)时,系统才会启动第 2 个条件(【制费超支差异额】降序)!
- 第三条件以此类推:如果连超支额都完全并列(比如本例中 01 工单与 08 工单同为 18,500 元,但它们分属不同车间;若在同车间也有并列),才会继续看第 3 排序条件。
如果你硬要让第二列在全表绝对降序,那除非把不同车间的工单混在一起——这在车间责任制核算里是绝对不允许的。各车间主任只对自己的产线负责!
四、 高级编辑器手把手实操代码
在随堂 Excel 课件中,老汪已经将动态相对路径(Q001规范)置入【配置】表。进入 Power Query 高级编辑器,贴入老汪的标准自适应代码:
let
// 💡 老汪敲黑板(免改路径直接刷新秘籍):换电脑解压后直接点击全部刷新即可,永不报红字!
当前路径 = try
let
raw = Text.From(Excel.CurrentWorkbook(){[Name="当前路径"]}[Content]{0}[Column1]),
clean = Text.Trim(raw)
in
if Text.EndsWith(clean, "\") then clean else clean & "\"
otherwise
"./",
// 1. 读取原始业务数据源
数据源路径 = 当前路径 & "原始业务数据表.xlsx",
源 = Excel.Workbook(File.Contents(数据源路径), null, true),
工单原始表 = 源{[Item="月末工单制费台账表", Kind="Sheet"]}[Data],
提升标题 = Table.PromoteHeaders(工单原始表, [PromoteAllScalars=true]),
更改类型 = Table.TransformColumnTypes(提升标题, {
{"工单编号", type text},
{"生产车间", type text},
{"配套核心零部件", type text},
{"主机厂客户", type text},
{"完工状态", type text},
{"计划工单量(件)", Int64.Type},
{"实际完工量(件)", Int64.Type},
{"制费超支差异额(元)", type number}
}),
// 2. 核心 Table.Sort:车间分类升序 + 车间内部超支降序抓大头
车间分类多列排序 = Table.Sort(更改类型, {
{"生产车间", Order.Ascending},
{"制费超支差异额(元)", Order.Descending}
}),
// 3. 注入财务洞察:添加自增排序序号与成本管控对策
添加排序序号 = Table.AddIndexColumn(车间分类多列排序, "排序序号", 1, 1, Int64.Type),
重排序号列 = Table.ReorderColumns(添加排序序号, {"排序序号", "工单编号", "生产车间", "配套核心零部件", "主机厂客户", "完工状态", "计划工单量(件)", "实际完工量(件)", "制费超支差异额(元)"}),
添加管控建议 = Table.AddColumn(重排序号列, "成本管控对策", each
if [#"制费超支差异额(元)"] >= 30000 then "🚨 严重超支异常!责令产线停机复盘工装与电耗"
else if [#"制费超支差异额(元)"] > 0 then "⚠️ 存在常规辅料/工时超耗,月末例会重点质询"
else "✅ 制费节约表现优异,提报月度精益改善奖励", type text)
in
添加管控建议
五、 最终清洗效果与车间管理看板
经过 Table.Sort 多条件复合处理后的产出结果如下(支持移动端横向水平滑动):
| 排序序号 | 工单编号 | 生产车间 | 配套核心零部件 | 主机厂客户 | 完工状态 | 计划工单量(件) | 实际完工量(件) | 制费超支差异额(元) | 成本管控对策 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | WO-202611-01 | CNC机加一车间 | 铝合金底盘下控制臂 | 比亚迪海豹 | 进行中 | 5,000 | 4,800 | 18,500.00 | ⚠️ 存在常规辅料/工时超耗,月末例会重点质询 |
| 2 | WO-202611-04 | CNC机加一车间 | 双活塞制动卡钳体 | 蔚来ES6总成 | 进行中 | 4,000 | 3,900 | 12,000.00 | ⚠️ 存在常规辅料/工时超耗,月末例会重点质询 |
| 3 | WO-202611-07 | CNC机加一车间 | 转向节转向节臂管 | 广汽埃安Hyper | 已完工 | 6,000 | 6,000 | -1,500.00 | ✅ 制费节约表现优异,提报月度精益改善奖励 |
| 4 | WO-202611-03 | 冲压焊接车间 | 电池包下壳体托盘 | 吉利极氪001 | 延期停滞 | 3,000 | 1,200 | 46,000.00 | 🚨 严重超支异常!责令产线停机复盘工装与电耗 |
| 5 | WO-202611-06 | 冲压焊接车间 | 前悬架高强副车架 | 理想L7底盘 | 进行中 | 3,500 | 3,100 | 15,000.00 | ⚠️ 存在常规辅料/工时超耗,月末例会重点质询 |
| 6 | WO-202611-05 | 高压压铸车间 | 驱动电机前置端盖 | 小鹏G6三电 | 延期停滞 | 6,000 | 4,500 | 35,000.00 | 🚨 严重超支异常!责令产线停机复盘工装与电耗 |
| 7 | WO-202611-08 | 高压压铸车间 | 双腔减震塔铸铝支架 | 小米SU7总成 | 进行中 | 4,500 | 4,100 | 18,500.00 | ⚠️ 存在常规辅料/工时超耗,月末例会重点质询 |
| 8 | WO-202611-02 | 高压压铸车间 | 轻量化通风制动盘 | 特斯拉Model Y | 已完工 | 8,000 | 8,000 | -3,200.00 | ✅ 制费节约表现优异,提报月度精益改善奖励 |
看!结构一目了然:每个车间作为一个独立模块,车间内部第一名就是最需要财务重点质询和抓改善的亏损工单!车间主任拿回去看,心服口服。
六、 老汪从业多年总结的 2 个避坑指南
- 别漏了嵌套大括号
{}: – 很多同学写多字段排序时,顺手写成了Table.Sort(源, {"车间", 0, "金额", 1}),PQ 会直接报错闪退。 – 牢记老汪的口诀:“大列表套小列表,一个小列表管一个字段”:{ {"字段1", 0}, {"字段2", 1} },层次分明,永不出错。 - 自定义非字母业务次序的妙招:
– 如果业务要求按【完工状态】排序,顺序必须是:
延期停滞 ➔ 进行中 ➔ 已完工。由于汉字拼音排序并不能契合这个业务逻辑,老汪最推荐的做法是:先加一个辅助排序列(if [完工状态]="延期停滞" then 1 else if [完工状态]="进行中" then 2 else 3),再用Table.Sort对该辅助列排序,最后把辅助列删掉。这一招在整个制造业财务分析中百试百灵!
大家赶紧下载文末的随堂课件,对照老汪的代码亲自上手演练一遍!














暂无评论内容