You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:20:48