ORACLE行转列和列转行

本文详细介绍Oracle数据库中如何利用UNPIVOT和PIVOT函数进行数据的行转列和列转行操作,通过实例演示了复杂的表述方式及简化后的表述方式,帮助读者掌握数据透视的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORACLE行转列和列转行

定义

  • 行转列:把一行多列数据转换成一列多行数据
  • 列转行:把一列多行数据转换成一行多列数据

ORACLE-行转列-unpivot

数据准备

-- 此表用于表示某人四个季度的收入:用于行转列测试
create table t_test1(
  v_name varchar2(50),-- 姓名
  v_age number,-- 年龄
  q_1 number,-- 第一季度
  q_2 number,-- 第二季度
  q_3 number,-- 第三季度
  q_4 number -- 第四季度
);

-- 插入数据
insert all 
into t_test1
values ('张三',23,2000,3000,4000,5000)
into t_test1
values ('李四',34,3000,4000,5000,6000)
select 1 from dual;

-- 提交数据
commit;

行转列使用

-- 行转列-复杂表述
select t.* from (-- 加个括号是为了表示括号里是个整体,便于理解
  (
    select 
      v_name,
      v_age,
      q_1,
      q_2,
      q_3,
      q_4
    from t_test1
  )
  unpivot (
    v_value -- 值列
    for v_q in(-- 类型列
      q_1 as '第一季度',-- 加默认值
      q_2 as '第二季度',-- 加默认值
      q_3 as '第三季度',-- 加默认值
      q_4-- 不加默认值
    )
  )
) t;

-- 行转列-简单表述
select * from t_test1
unpivot (
  v_value -- 值列
  for v_q in(-- 类型列
    q_1 as '第一季度',-- 加默认值
    q_2 as '第二季度',-- 加默认值
    q_3 as '第三季度',-- 加默认值
    q_4-- 不加默认值
  )
);

ORACLE-列转行-pivot

数据准备

-- 此表用于表示某人四个季度的收入:用于列转行测试
create table t_test2(
  v_name varchar2(50),-- 姓名
  v_age number,-- 年龄
  v_q varchar2(10),-- 季节类型列
  v_value number-- 值列
);


-- 插入数据
insert all 
into t_test2
values ('张三',23,'第一季度',2000) 
into t_test2
values ('张三',23,'第二季度',3000) 
into t_test2
values ('张三',23,'第三季度',4000) 
into t_test2
values ('张三',23,'第四季度',5000) 
into t_test2
values ('李四',34,'第一季度',3000)
into t_test2
values ('李四',34,'第二季度',4000)
into t_test2
values ('李四',34,'第三季度',5000)
into t_test2
values ('李四',34,'第四季度',6000)
select 1 from dual;

-- 提交数据
commit;

列转行使用

-- 列转行-复杂表述
select t.* from(-- 加个括号是为了表示括号里是个整体,便于理解
  (
    select 
      v_name,v_age,-- 这两个字段用于分组,相当于group by,一般只取主键
      v_q,-- 这个字段用于区分列,用于生成不同列
      v_value -- 这个字段用于汇总统计
    from t_test2
  )
  pivot (
    sum(v_value)
    for v_q in (
      '第一季度' as 第一季度,
      '第二季度' q_2,
      '第三季度' as q_3,
      '第四季度'
    )
  )
) t;

-- 列转行-简单表述
select * from t_test2
pivot(
  sum(v_value) as 后缀
  for v_q in (
    '第一季度' as 第一季度,
    '第二季度' q_2,
    '第三季度' as q_3,
    '第四季度'
  )
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值