SQL多列转行问题:如何将多组编码列拆分为带标识字段的独立行?
可行实现方案
1. SQL实现(适用于数据库存储的表数据)
核心用UNION ALL拼接26组编码列,写法简单直接,适配26组固定分组的场景:
SELECT ID1, COL1, COL2, `CODE A1` AS CODE1, `CODE A2` AS CODE2, `CODE A3` AS CODE3 FROM 表A UNION ALL SELECT ID1, COL1, COL2, `CODE B1` AS CODE1, `CODE B2` AS CODE2, `CODE B3` AS CODE3 FROM 表A UNION ALL -- 中间依次补全C到Y的分组,结构和上面一致 UNION ALL SELECT ID1, COL1, COL2, `CODE Z1` AS CODE1, `CODE Z2` AS CODE2, `CODE Z3` AS CODE3 FROM 表A
如果是支持UNPIVOT语法的数据库(比如Oracle、SQL Server、Spark SQL等),可以写得更简洁:
-- 以Spark SQL为例 SELECT ID1, COL1, COL2, CODE1, CODE2, CODE3 FROM 表A UNPIVOT ( (CODE1, CODE2, CODE3) FOR group_code IN ( (`CODE A1`, `CODE A2`, `CODE A3`), (`CODE B1`, `CODE B2`, `CODE B3`), -- 依次补全剩余分组 (`CODE Z1`, `CODE Z2`, `CODE Z3`) ) )
2. Python Pandas实现(适用于本地文件存储的表数据)
用循环拼接即可实现,示例代码:
import pandas as pd # 读取原始表数据,假设是csv文件 df = pd.read_csv('表A.csv') # 固定标识列 id_cols = ['ID1', 'COL1', 'COL2'] # 生成所有编码列分组 groups = [] for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': groups.append([f'CODE {c}1', f'CODE {c}2', f'CODE {c}3']) # 遍历分组拼接结果 result = pd.DataFrame() for g in groups: tmp = df[id_cols + g].copy() tmp.columns = id_cols + ['CODE1', 'CODE2', 'CODE3'] result = pd.concat([result, tmp], ignore_index=True) # 导出结果 result.to_csv('拆分后结果.csv', index=False)
3. Excel实现(适用于小数据量的Excel表格)
通过Power Query实现操作步骤:
- 选中原始表数据,点击「数据」选项卡→「从表格/区域」导入Power Query编辑器
- 选中ID1、COL1、COL2三列,右键→「逆透视其他列」
- 新增自定义列,提取编码的分组标识(比如CODE A1的分组标识为A)
- 按分组标识、ID1、COL1、COL2分组,把值转成列,得到每行三个编码的结构
- 导出数据到Excel即可
内容的提问来源于stack exchange,提问作者DERookie
相关产品推荐
相关产品推荐

