文 / 老汪(汽车零部件财务与商业智能实战派)
专栏:【Excel BI 财务建模实战课讲义(第2阶段)】 · 期数:EP038
核心函数:Table.ToRows/Table.ToColumns/Table.FromRows/Table.FromColumns
📌 老汪开篇导读:打破表格与列表的物理边界
各位财务朋友、成本会计与产线数据分析师:
平时我们在 Excel 或者 Power Query 里整理数据,最常接触的就是工整规矩的二维表格(Table)。但当你深入接触 M 语言的内核逻辑后,你会发现一个颠覆认知的真相:
在 Power Query 的底层世界里,根本不存在不可分割的二维表格,它本质上就是一堆嵌套列表(List of Lists)或记录集合(List of Records)的视觉封装!
平时大家做财务月结或者产线成本台账,经常遇到这三大痛点:
1. 想在底层搞复杂的矩阵转置或动态批量计算,面对整张 Table 感到束手无策,不知道怎么把它按行、按列拆成纯净的数据管道;
2. 想在查询末尾动态追加一行“全厂合计”或“平均值”,结果发现 PQ 根本没有像 Excel 那样顺手一拉的“汇总行”开关,很多人逼得又退回 Excel 透视表去拼凑;
3. 不知道什么时候用 ToRows、什么时候用 ToColumns,一旦用 FromRows 还原表格,只要各行长度稍微不齐就会弹窗报红,搞得人一头雾水。
今天老汪就带大家用汽车零部件制造业真实的车间制造成本核算案例,把 Table.ToRows / Table.ToColumns / Table.FromRows / Table.FromColumns 这四张王牌拆解通透,并教大家写出一套全自动横向求小计、纵向动态追加全厂总计行的高级 M 语言工业级管道!
🛠️ 一、 核心函数物理机制拆解
在动手实操前,我们必须从几何和内存维度搞清楚这四个函数的转换关系:
┌────────────────────────────────────────────────────────┐
│ 标准二维表格 (Table) │
└────────────────────────────────────────────────────────┘
│ ▲
Table.ToRows(水平横切) Table.FromRows(按行还原)
Table.ToColumns(垂直抽柱) Table.FromColumns(按列还原)
▼ │
┌────────────────────────────────────────────────────────┐
│ 嵌套列表集合 (List of Lists) │
└────────────────────────────────────────────────────────┘
| 函数名称 | 转换方向 | 拆解/重构机制 | 老汪避坑要点 |
|---|---|---|---|
Table.ToRows(table) |
Table ➔ List | 沿水平方向“切香肠”,将表格每一行转换为一个包含各单元格值的子列表。 | 生成 { {行1值...}, {行2值...} },每个子列表长度严格等于表格列数。 |
Table.ToColumns(table) |
Table ➔ List | 沿垂直方向“抽立柱”,将表格每一列抽离为一个独立的列列表。 | 纵向批量统计神器!列列表非常适合直接喂给 List.Transform 遍历计算各列和/均值。 |
Table.FromRows(rows, [columns]) |
List ➔ Table | 将“行的列表集合”逆向组装回二维表格,支持第二参数注入表头。 | ⚠️ 强校验规则:各子行长度必须严格一致,有一行缺列就会直接报错崩溃! |
Table.FromColumns(columns, [columns]) |
List ➔ Table | 将“列的列表集合”并排拼接恢复为表格,支持第二参数注入表头。 | 💡 宽容对齐机制:若各列长短不一,PQ 会自动用 null 在底部补齐,绝不报错。 |
🏭 二、 汽车零部件制造业业务场景实战
1. 业务背景
在我们汽车零部件一级供应商(Tier 1)的底盘事业部,财务 BP 和成本会计每个季度末都需要出一份《车间制造成本多维台账》。
全厂目前有 5 个核心车间(压铸、机加、冲焊、表面处理、总成装配),分别配套比亚迪、特斯拉、吉利、蔚来、理想等主机厂核心车型。各车间每个季度的动力电费、辅料损耗、工装折旧与人工制造费用台账如下:
| 产线车间编号 | 责任车间主任 | 配套主力车型 | Q1制造成本(万元) | Q2制造成本(万元) | Q3制造成本(万元) | Q4制造成本(万元) |
|---|---|---|---|---|---|---|
| WK-01 铝合金精密压铸车间 | 张德山(厂模范) | 比亚迪海豹/汉 EV | 185.6 | 192.4 | 178.2 | 205.8 |
| WK-02 CNC五轴数控机加车间 | 李明亮 | 特斯拉Model Y/3 | 240.5 | 255.8 | 232.0 | 268.4 |
| WK-03 机器人冲压焊接车间 | 王志强 | 吉利极氪001 | 145.2 | 152.0 | 138.5 | 160.3 |
| WK-04 表面阳极钝化喷涂车间 | 赵大宝 | 蔚来ES6/ET5 | 95.8 | 98.6 | 92.4 | 104.2 |
| WK-05 智能化底盘总成装配线 | 孙海鹏 | 理想L7/L8 | 120.4 | 126.5 | 118.0 | 135.0 |
2. 报表双重诉求
- 横向行维度(车间全年小计):车间主任需要清晰掌握自己车间全年的成本总开销;
- 纵向列维度(全厂季度与年度大计行):制造总监和财务经理需要看到各季度全厂的总支出,并且在报表最底部追加一行清晰的 “★ 全厂年度总计”!
如果用传统的手工合并或者固定单元格公式,下季度万一增加新的车间或者拆分明细,整张表就完全乱套了。我们要在 Power Query 里实现全动态自适应横纵汇总!
🚀 三、 老汪手把手推导:三大阶段实现全自动动态汇总
阶段一:横向行维度动态求和(车间全年小计)
很多新手在做横向求和时,写出来的代码是这样的:
[#"Q1制造成本(万元)"] + [#"Q2制造成本(万元)"] + [#"Q3制造成本(万元)"] + [#"Q4制造成本(万元)"]
这种硬编码一旦列名微调或遇到空值就报红。
老汪教大家标准的 M 语言管道打法:
利用我们在 EP035 学过的 Record.ToList(_),把整行记录转换为值的列表,再用 List.Skip(_, 3) 自动剔除前 3 列的文本字段,剩下的纯数值列表直接交由 List.Sum 秒级汇总:
💡 老汪敲黑板(免改路径直接刷新秘籍):
平时做财务分析最怕换台电脑一刷新就报错“找不到文件路径”。老汪在给各位学员配套的实操课件【配置】表 A1 单元格中预置了自适应公式,大家把本课案例包解压后直接点击 Excel 的【全部刷新】即可秒级重现,绝不报红字!大家可以把这套自适应架构无缝迁移到公司的日常模型中! 实操指南点此篇文章:《实操指南》
添加横向小计 = Table.AddColumn(更改类型, "车间全年累计成本(万元)", each
let
行记录值列表 = Record.ToList(_),
纯数值列表 = List.Skip(行记录值列表, 3),
行求和 = List.Sum(纯数值列表)
in
行求和,
type number
)
这样,无论后面有 4 个季度还是 12 个月份,只要前 3 列是基本信息,后面所有数值列都会被动态通吞并汇总,稳如泰山!
阶段二:纵向列维度拆解与单行总计表重构
这是本节课最核心的技术突破口!
1. 用 Table.ToColumns 垂直抽离各列
列列表集合 = Table.ToColumns(添加横向小计)
此时,列列表集合 变成了包含 8 个子列表的大集合:
– 子列表 1:{"WK-01...", "WK-02...", ...}(车间编号文本)
– 子列表 2:{"张德山...", "李明亮...", ...}(主任文本)
– 子列表 3:{"比亚迪...", "特斯拉...", ...}(车型文本)
– 子列表 4~8:各季度制造成本与全年累计的纯数值列表!
2. 用 List.Transform 批量计算每列总计值
我们通过 List.Transform 遍历每一个列列表:
– 对于数值列,List.Sum(_) 瞬间算出全厂总和;
– 对于前三列文本,List.Sum 遇到文本必然抛错,我们用 try...otherwise 优雅降级:如果是第 1 列(索引 0)就标记为 "★ 全厂年度总计",其余非数值列填入 "-" 占位:
计算总计列列表 = List.Transform(列列表集合, each
try
List.Sum(_)
otherwise
(if List.PositionOf(列列表集合, _) = 0 then "★ 全厂年度总计" else "-")
)
执行完毕后,我们得到了一个完美的汇总列表:
{ "★ 全厂年度总计", "-", "-", 787.5, 825.3, 759.1, 873.7, 3245.6 }
3. 用 Table.FromRows 逆向重构为单行汇总表
得到了汇总列表,怎么把它变回标准的一行 Table 呢?
直接调用 Table.FromRows!第二参数直接复用 Table.ColumnNames(添加横向小计):
原表标题集合 = Table.ColumnNames(添加横向小计),
生成总计行表 = Table.FromRows({计算总计列列表}, 原表标题集合)
💡 老汪敲黑板:注意看
{计算总计列列表}外面那层大括号!因为Table.FromRows的输入参数必须是行的集合(List of Rows),我们虽然只有一行总计,但也必须套上一层大括号,否则函数会因为找不到行的嵌套结构而抛错!
阶段三:纵向拼接合并(明细表 & 总计行)
有了带横向小计的明细表,又有了独立的单行总计表,最后一步就是两表拼接:
最终合并看板 = Table.Combine({添加横向小计, 修正总计行类型})
或者直接使用 M 语言的表格连接符:添加横向小计 & 修正总计行类型!
最终输出的看板如下,横纵双向严密闭环,全厂制造成本 3,245.6 万元分厘不差:
| 产线车间编号 | 责任车间主任 | 配套主力车型 | Q1制造成本(万元) | Q2制造成本(万元) | Q3制造成本(万元) | Q4制造成本(万元) | 车间全年累计成本(万元) |
|---|---|---|---|---|---|---|---|
| WK-01 铝合金精密压铸车间 | 张德山(厂模范) | 比亚迪海豹/汉 EV | 185.6 | 192.4 | 178.2 | 205.8 | 762.0 |
| WK-02 CNC五轴数控机加车间 | 李明亮 | 特斯拉Model Y/3 | 240.5 | 255.8 | 232.0 | 268.4 | 996.7 |
| WK-03 机器人冲压焊接车间 | 王志强 | 吉利极氪001 | 145.2 | 152.0 | 138.5 | 160.3 | 596.0 |
| WK-04 表面阳极钝化喷涂车间 | 赵大宝 | 蔚来ES6/ET5 | 95.8 | 98.6 | 92.4 | 104.2 | 391.0 |
| WK-05 智能化底盘总成装配线 | 孙海鹏 | 理想L7/L8 | 120.4 | 126.5 | 118.0 | 135.0 | 499.9 |
| ★ 全厂年度总计 | – | – | 787.5 | 825.3 | 759.1 | 873.7 | 3,245.6 |
💡 老汪敲黑板:工业级实战避坑与学员操作秘籍
- 【特别提醒】关于《最终完成版_带PQ查询.xlsx》与动手实操:
大家解压课件包后打开《最终完成版_带PQ查询.xlsx》,看到的表格已经是清洗整理好的成果样式(标杆参照)。要想真正掌握本课技能,必须参考课件包内附带的《PowerQuery随堂实操课件学员使用与M脚本演练指南.docx》,新建空白查询并粘贴《M_动态自适应脚本.m》,一步一步点击右侧【应用的步骤】亲手演练复现! Table.FromRows的等长死穴:
Table.FromRows要求传入的每一个行子列表长度必须完全相同。如果你在构造某些特定数据行时漏掉了一列,整个查询就会直接瘫痪。如果不确定长度,优先考虑Table.FromColumns,或者在构建行列表时用null把缺失列补齐!- Q001 动态相对路径机制(免改路径直接刷新秘籍):
平时做财务分析最怕换电脑报错,老汪已经在随堂课件的【配置】表写好公式,大家解压到任意电脑或工位,直接点击【数据】➔【全部刷新】即可,绝不报红字路径不存在! - 保持数据类型纯洁性:
在拼接合并总计行之后,务必用Table.TransformColumnTypes对数值列做一次显式类型转换。因为总计行在生成时,M 语言可能默认推断为any类型,显式转换能确保后续在 Power BI 或 Excel 建模中正确聚合。
🎁 随堂实操课件包下载
本节课专属配套实操资产已全量打包,包含:
1. 《原始业务数据表.xlsx》:底盘系统五大制造车间各季度制造成本原始台账;
2. 《最终完成版_带PQ查询.xlsx》:内嵌 Q001 自适应配置表与完整横纵汇总 Power Query 脚本,开箱即用(内含成果展示与演练底表);
3. 《M_动态自适应脚本.m》:标准工业级 M 语言核心脚本(含详细中文逐行注释);
4. 《PowerQuery随堂实操课件学员使用与M脚本演练指南.docx》:【学员必备实操指引】六步图文拆解,手把手带您新建空白查询、注入 M 脚本并单步回溯演练。












暂无评论内容