我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle——行转列与列转行

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle——行转列与列转行

文章目录

行转列

把某一个字段的值作为唯一值,然后另外一个字段的行值转换成它的列值

转换过程大致如下所示:
在这里插入图片描述
通常情况下,采取group by 唯一字段进行分组,然后依据不同的列进行判断输出就能转换。

创建表和增加测试数据

建表语句和增加测试数据sql如下所示:

create table XJ_TEST_LtoH(      stuid varchar(20),      stuname varchar(40),      coursename varchar(40),      score int);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201001','张三','数学',40);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201001','张三','语文',50);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201001','张三','理综',120);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201011','李四','数学',32);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201011','李四','语文',45);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201011','李四','理综',123);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201031','王五','数学',54);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201031','王五','语文',56);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)values('sc202201031','王五','理综',100);

执行完毕后,数据库中当前的数据结构如下:
在这里插入图片描述

同所属的类,对应不同的值,采取不同列进行存储。

方式一:先分组,再统计平铺

将数据根据学员名分组,将学科成绩平铺展示。sql如下所示:

-- 方式一:先分组,再单元拆分select t.stuid,t.stuname ,sum(decode(t.coursename,'数学',t.score,0)) "数学",sum(decode(t.coursename,'语文',t.score,0)) "语文",sum(decode(t.coursename,'理综',t.score,0)) "理综"from XJ_TEST_LtoH t group by t.stuname,t.stuid;

在这里插入图片描述

方式二:使用Oracle11g自带函数PIVOT实现

Oracle11g及以后自带函数PIVOT就能实现上述的效果,且代码量很小。

select * fromPIVOT (sum(xxx ) for XXX    in(mm,nn) )

具体的使用方式,如下:

-- 方式二:Oracle11g之后提供了自带函数PIVOTselect * from XJ_TEST_LtoH pivot (      sum(score )       for      coursename        in('语文' as 语文,'数学' as 数学,'理综' as 理综) );

在这里插入图片描述

列转行

把一行当中的列的字段按照行的唯一值转换成多行数据。

还是上面的栗子,先创建测试表和增加测试数据。

创建表和增加测试数据

------ 列转行前的表创建create table XJ_TEST_HL as (select t.stuid,t.stuname ,sum(decode(t.coursename,'数学',t.score,0)) "数学",sum(decode(t.coursename,'语文',t.score,0)) "语文",sum(decode(t.coursename,'理综',t.score,0)) "理综"from XJ_TEST_LtoH t group by t.stuname,t.stuid);

这种语法,就能直接将查询到的数据信息,以及表结构中字段类型等信息,映射成一张新的表。

此时的数据结构如下所示:
在这里插入图片描述

方式一:union all 单个合并

查询每个需要拆分的列数据信息,以相同的列名接收,再将数据合并。

-- 方式一:先查询单个,再将所有数据拼接select * from (select t.stuid,t.stuname,'语文' as coursename,t.语文 as score from XJ_TEST_HL tunion allselect t.stuid,t.stuname,'数学' as coursename,t.数学 as score from XJ_TEST_HL tunion allselect t.stuid,t.stuname,'理综' as coursename,t.理综 as score from XJ_TEST_HL t) p order by p.stuname;

在这里插入图片描述

方式二:unpivot 函数实现

语法如下所示:

select 字段 from 数据集unpivot(自定义列名 for 自定义列名 in(列名))

【注意】这里的是 unpivot ,不是 pivot !

-- 方式二-- 语法  select 字段 from 数据集 unpivot(自定义列名 for 自定义列名 in(列名))select * from XJ_TEST_HLunpivot (score for coursename in(语文,数学,理综));

在这里插入图片描述

总结

pivotunpivot不太好理解,并且属于oracle特有,针对别的类型数据库,可能方式一更好点。

资料参考

oracle怎么实现行列转换

来源地址:https://blog.csdn.net/qq_38322527/article/details/127445099

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle——行转列与列转行

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SQL行转列与列转行的方法

本文小编为大家详细介绍“SQL行转列与列转行的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL行转列与列转行的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.数据集+---+----------+
2023-06-29

postgresql行转列与列转行图文教程

目录列转行行转列总结列转行PostgreSQL列转行的思路主要是利用string_to_array进行数组转换,然后用unnest进行行拆分select t.bid_unit,unit_id from unit twhere t.uni
2023-06-11

MySQL实现列转行与行转列的操作代码

目录引言列转行(Pivoting)示例数据转编程网换前查询结果列转行 SQL 语句转换后查询结果行转列(Unpivoting)示例数据转换前查询结果行转列 SQL 语句转换后查询结果引言在处理数据时,我们常常会遇到需要将表中的列(字段)转
MySQL实现列转行与行转列的操作代码
2024-09-25

mysql 行转列

以下是其中比较常见的几种方法: 使用GROUP_CONCAT函数 可以使用GROUP_CONCAT函数将多行数据合并为一行,并以逗号或其他分隔符进行分隔。通过SELECT语句和GROUP BY子句,可以将数据行转换为列。具体语法如下: SE
2023-08-20
2023-08-31

mysql行转列和列转行的方法是什么

在MySQL中,行转列和列转行通常使用以下方法来实现:使用聚合函数和CASE语句进行行转列操作:SELECTMAX(CASE WHEN attribute = 'attribute1' THEN value END) A
mysql行转列和列转行的方法是什么
2024-04-09

MySQL实验--静态行转列->动态行转列->存储过程使用行转列

概述 今天主要用一个实验来介绍一下在使用行转列的过程及相关实验。下面演示一下。 创建表 这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩三张表:学生表、课程表、成绩表 1、学生表 就简单一点,学生学号、学生姓名两个字段 CREATE T
MySQL实验--静态行转列->动态行转列->存储过程使用行转列
2016-08-19

编程热搜

目录