Oracle SQL表行转列技术问询:如何将现有表转换为目标结构
问题描述
现有表A(结构可见对应图片),需要转换为指定的目标表结构(可见对应图片)。尝试编写了如下SQL语句,但执行后结果是各字段值分散在不同行,关联数据并未处于同一行,寻求正确实现方法:
SELECT CASE WHEN LENGTH(CODE) = 2 THEN NAME ELSE NULL END AS CODE1, CASE WHEN LENGTH(CODE) = 4 THEN NAME ELSE NULL END AS CODE2, CASE WHEN LENGTH(CODE) = 6 THEN NAME ELSE NULL END AS CODE3, CASE WHEN LENGTH(CODE) = 8 THEN NAME ELSE NULL END AS CODE4 FROM TABLEA;
解决方案
你原来的SQL会为表A的每一行生成一条记录,每条记录只有一个字段有值其余为NULL,所以结果是分散的行。要把同一层级关联的数据合并到同一行,需要用聚合函数配合分组,把对应长度的CODE对应的NAME聚合起来。
假设表A中的CODE是层级结构(比如2位是一级,4位是二级且前两位对应一级,以此类推),可以用MAX()或MIN()聚合函数——因为每个层级在同一分组里只有一个有效NAME值,聚合后就能把非NULL值保留下来:
SELECT MAX(CASE WHEN LENGTH(CODE) = 2 THEN NAME ELSE NULL END) AS CODE1, MAX(CASE WHEN LENGTH(CODE) = 4 THEN NAME ELSE NULL END) AS CODE2, MAX(CASE WHEN LENGTH(CODE) = 6 THEN NAME ELSE NULL END) AS CODE3, MAX(CASE WHEN LENGTH(CODE) = 8 THEN NAME ELSE NULL END) AS CODE4 FROM TABLEA -- 如果是按一级CODE分组(比如每个一级CODE对应一组二级、三级、四级),添加分组条件 GROUP BY LEFT(CODE, 2);
说明
- 聚合函数
MAX()会忽略NULL值,只保留每个分组里对应CASE条件的非NULL NAME值,这样就能把同一层级关联的数据合并到同一行。 - 如果你的层级分组逻辑不是按前两位,需要调整
GROUP BY的条件,确保同一组的关联数据被分到一起。
内容的提问来源于stack exchange,提问作者user8779054
相关产品推荐
相关产品推荐

