如何在Excel或SQL中将宽格式数据转换为长格式(附示例)
我来帮你搞定宽格式转长格式的需求,不管用Excel还是SQL都有对应的实现方法,下面给你详细拆解:
用Excel实现宽转长(逆透视)
Excel里有两种常用方法,分别适合不同的数据规模:
方法1:Power Query(推荐,适合大数据量)
这是最便捷的方式,操作步骤如下:
- 选中你的原始数据区域(要包含表头哦)
- 点击顶部菜单栏的「数据」选项卡 → 选择「从表格/区域」,弹出的窗口里确认勾选「我的表格有标题」,点击确定进入Power Query编辑器
- 在编辑器中,先选中
ID列(这列是不需要转换的标识列),然后点击「转换」选项卡 → 「逆透视列」→ 选择「逆透视其他列」 - 这时你会看到列名变成了
ID、属性、值,双击这两个新表头,分别改成DATA_TYPE和VALUE - 最后点击「关闭并上载」,就能得到你想要的长格式数据啦
方法2:公式+手动填充(适合小数据量)
如果数据行数不多,用公式也能快速实现:
假设你的原始数据在A1:D3区域(A列=ID,B列=TOTAL,C列=SCORE,D列=PLAYER):
- 在F1、G1、H1分别输入
ID、DATA_TYPE、VALUE作为新表头 - F2单元格输入公式:
=INDEX($A$2:$A$3,INT((ROW()-2)/3)+1),下拉填充到6行(因为2个ID×3个数据类型) - G2单元格输入公式:
=INDEX($B$1:$D$1,MOD(ROW()-2,3)+1),下拉填充 - H2单元格输入公式:
=INDEX($B$2:$D$3,INT((ROW()-2)/3)+1,MOD(ROW()-2,3)+1),下拉填充
完成后就能得到目标格式的数据了
用SQL实现宽转长(UNPIVOT/UNION ALL)
SQL里分两种场景,取决于你的数据库是否支持UNPIVOT语法:
场景1:数据库支持UNPIVOT(如SQL Server、Oracle、PostgreSQL 11+)
直接用UNPIVOT语法一步到位:
SELECT ID, DATA_TYPE, VALUE FROM 你的表名 UNPIVOT ( VALUE FOR DATA_TYPE IN (TOTAL, SCORE, PLAYER) ) AS unpvt_result;
解释一下:VALUE是转换后的数值列名,DATA_TYPE是类型列名,IN()里面列出需要转换的宽表列名。
场景2:数据库不支持UNPIVOT(如MySQL 8.0之前版本)
用UNION ALL把每个列拆成单独的行:
SELECT ID, 'TOTAL' AS DATA_TYPE, TOTAL AS VALUE FROM 你的表名 UNION ALL SELECT ID, 'SCORE' AS DATA_TYPE, SCORE AS VALUE FROM 你的表名 UNION ALL SELECT ID, 'PLAYER' AS DATA_TYPE, PLAYER AS VALUE FROM 你的表名 ORDER BY ID, DATA_TYPE;
ORDER BY可以让同一个ID的行集中显示,看起来更整洁。
内容的提问来源于stack exchange,提问作者garry




