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

如何在Oracle中将列状数据转换为行状展示(表1转表2)

Oracle 列转行(行转列)实现方案

针对将表1的列状(多行键值对)数据转换为表2的行状(单行多字段)展示的需求,提供以下几种实现方式:

方法1:使用PIVOT函数(Oracle 11g+)

PIVOT是Oracle 11g及以上版本支持的内置行转列函数,语法简洁高效。假设表1结构为table1(id, key_name, key_value),目标列包含姓名、年龄、性别,示例SQL如下:

SELECT *
FROM table1
PIVOT (
  -- 聚合函数:因每个id+key_name唯一,MAX/MIN不影响结果
  MAX(key_value)
  -- 指定要转成列的字段
  FOR key_name IN (
    '姓名' AS 姓名,
    '年龄' AS 年龄,
    '性别' AS 性别
  )
)
ORDER BY id;

方法2:CASE WHEN + GROUP BY(兼容低版本)

如果使用Oracle 10g及以下版本,可通过CASE WHEN匹配字段值,结合GROUP BY合并行:

SELECT
  id,
  MAX(CASE WHEN key_name = '姓名' THEN key_value END) AS 姓名,
  MAX(CASE WHEN key_name = '年龄' THEN key_value END) AS 年龄,
  MAX(CASE WHEN key_name = '性别' THEN key_value END) AS 性别
FROM table1
GROUP BY id
ORDER BY id;

方法3:动态SQL(处理不固定的key值)

若表1中key_name的取值不固定,无法提前枚举,可通过动态SQL自动生成目标列:

DECLARE
  v_sql VARCHAR2(4000);
  v_cols VARCHAR2(4000);
BEGIN
  -- 提取所有唯一的key_name,生成列定义语句
  SELECT LISTAGG('''' || key_name || ''' AS ' || key_name, ', ')
         WITHIN GROUP (ORDER BY key_name)
  INTO v_cols
  FROM (SELECT DISTINCT key_name FROM table1);

  -- 拼接完整的PIVOT查询语句
  v_sql := 'SELECT * FROM table1 PIVOT (MAX(key_value) FOR key_name IN (' || v_cols || ')) ORDER BY id';

  -- 执行动态SQL
  EXECUTE IMMEDIATE v_sql;
END;
/

内容的提问来源于stack exchange,提问作者xajid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:16