别再手搓Excel公式!PQ逆透视1键拆乱码表
一句话核心价值:学会Power Query的逆透视功能,3秒搞定过去半小时都理不清的乱码数据表,从此告别复制粘贴和手写公式的加班夜!
目录
1. 乱表克星:逆透视是什么神仙操作?
你是不是也经常收到这种让人头疼的表格?同一类数据(比如每月销售额)被横着铺开在不同的列里(1月、2月、3月……)。想汇总全年数据?只能用SUM一个一个加。想分析月度趋势?还得先把数据转置过来。手动操作又慢又容易出错。
M语言核心代码(逆透视基础):
let 源 = Excel.CurrentWorkbook(){[Name="乱码表"]}[Content], 逆透视列 = Table.UnpivotOtherColumns(源, {"产品名称"}, "月份", "销售额")in 逆透视列
原理解析:
Table.UnpivotOtherColumns 是逆透视的核心函数。它的逻辑是:“保留某些列,把其他所有列‘推倒’成两列”。上面代码中,{"产品名称"} 是指定要保留的列(锚点)。"月份" 和 "销售额" 是新生成的两列名:一个放原来的列标题(1月、2月…),一个放对应的数值。这个过程就像把一堵横着放的砖墙(宽表)推倒,砖块整齐地垒成一列(长表),数据关系瞬间清晰。
金句:逆透视不是旋转表格,而是把“躺平”的数据“扶起来”排队!
2. 实战拆解:1键把“宽表”变“长表”
想象一下,财务给你一张2026年上半年的费用表,横向是6个月份,纵向是不同部门。老板突然要你按部门看看各月的费用趋势。这时候,逆透视就是你的秒杀技。
M语言实战代码(处理多个月份):
let 源 = Excel.CurrentWorkbook(){[Name="部门费用表"]}[Content], 更改类型 = Table.TransformColumnTypes(源,{{"1月", Int64.Type}, {"2月", Int64.Type}, ...}), 逆透视 = Table.UnpivotOtherColumns(更改类型, {"部门"}, "月份", "费用金额"), 排序 = Table.Sort(逆透视,{{"部门", Order.Ascending}, {"月份", Order.Ascending}})in 排序
原理解析:
第一步更改类型很重要,确保数字列是数值类型,否则逆透视后可能还是文本,无法计算。Table.UnpivotOtherColumns 一键将“1月”到“6月”这6列,压缩成“月份”和“费用金额”两列。最后用Table.Sort排序,让数据看起来更规整。转换后,数据格式变为标准的“部门-月份-费用”三列,直接拖进数据透视表,趋势图秒出。这比用OFFSET、INDEX等函数编织复杂的公式网要可靠和高效一万倍。
金句:数据清洗的终点,是让透视表和图表“吃得舒服”。
3. 进阶玩法:分组逆透视,精准整理
更复杂的场景来了:一张表里,既有“计划销售额”又有“实际销售额”,也都按月份横向排列。你需要同时分析计划和实际的对比。这时需要一点小技巧。
M语言进阶代码(选择性逆透视):
let 源 = Excel.CurrentWorkbook(){[Name="计划实际表"]}[Content], 逆透视计划 = Table.UnpivotOtherColumns(源, {"项目", "实际1月", "实际2月"...}, "计划月份", "计划额"), 逆透视实际 = Table.UnpivotOtherColumns(逆透视计划, {"项目", "计划月份", "计划额"}, "实际月份", "实际额"), 调整列序 = Table.SelectColumns(逆透视实际, {"项目", "计划月份", "计划额", "实际月份", "实际额"})in 调整列序
原理解析:
这个操作展示了逆透视的灵活性:可以分步进行。第一次逆透视,我们故意在“保留列”参数里包含了所有“实际月”列,从而只把“计划月”列逆透视掉。第二次逆透视,再处理“实际月”列。通过分步操作和精心选择要保留的列,我们能实现复杂的表格结构重组,这是任何基础Excel功能都无法轻松做到的。
金句:高级技巧就是把多个基础操作,像乐高一样拼出无限可能。
4. DAX联动:逆透视后秒算动态指标
数据用Power Query清洗成长表后,就该Power Pivot的DAX公式登场了。这才是实现“体系化分析”的关键一步。
DAX公式展示(基于逆透视后的模型):
// 基础求和总销售额 = SUM('销售长表'[销售额])// 计算每月占全年比例月度占比 = DIVIDE([总销售额], CALCULATE([总销售额], ALL('销售长表'[月份])))// 计算环比增长月增长率 = VAR CurrentMonthSales = [总销售额]VAR PrevMonthSales = CALCULATE([总销售额], PREVIOUSMONTH('日期表'[日期]))RETURN DIVIDE(CurrentMonthSales - PrevMonthSales, PrevMonthSales)
原理解析:
CALCULATE是DAX的灵魂,它能改变计算上下文。在计算月度占比时,ALL函数清除了对月份筛选,从而得到全年总额作为分母。PREVIOUSMONTH是时间智能函数,轻松实现复杂的同期对比。这一切动态计算的前提,就是数据必须是规范的“长表”格式。逆透视为你搭建好了这个舞台。如果还是宽表,这些强大的DAX公式将无用武之地。
金句:Power Query打造标准数据流水线,Power Pivot在上面建造智能分析工厂。
5. 避坑指南:这些细节决定成败
学会了神技,也要小心陷阱。这几个细节不注意,可能前功尽弃。
关键注意点:
- 1. 数据类型先行:逆透视前,务必用
Table.TransformColumnTypes确认数值列是数字类型,日期列是日期类型。文本型数字逆透视后无法计算。 - 2. 标题行必须规范:原表的列标题(如“1月”、“2月”)将成为新“属性列”(如“月份”)的值。确保标题清晰、无合并单元格。
- 3. 空值与错误值:源表中的空单元格,逆透视后会被保留。可以使用
Table.ReplaceValues或筛选功能在逆透视前后进行处理。 - 4. 连接刷新:所有操作完成后,在Excel中点击“全部刷新”,数据才能更新。这个过程是可重复的,一次设置,终身受用。
终极心法:把Power Query的清洗步骤(包括逆透视)看作数据预处理流水线。原始数据从一端进去,规范的长表从另一端出来。你的核心工作从重复的手工操作,变成了设计和维护这条自动化流水线。
金句:真正的效率提升,不是把一件事做快100倍,而是让这件事只需要做1次。