[一]、行转列

1.1、初始测试数据

表结构:TEST_TB_GRADE

create

table TEST_TB_GRADE

(

ID        NUMBER(10)notnull,

USER_NAME VARCHAR2(20CHAR),

COURSE    VARCHAR2(20CHAR),

SCOREFLOAT

)

createtableTEST_TB_GRADE

(

ID        NUMBER(10) notnull,

USER_NAME VARCHAR2(20 CHAR),

COURSE    VARCHAR2(20 CHAR),

SCORE     FLOAT

)

初始数据如下图:

1.2、 如果需要实现如下的查询效果图:

这就是最常见的行转列,主要原理是利用decode函数、聚集函数(sum),结合group by分组实现的,具体的sql如下:

select t.user_name,

sum(decode(t.course,'语文', score,null))asCHINESE,

sum(decode(t.course,'数学', score,null))asMATH,

sum(decode(t.course,'英语', score,null))asENGLISH

fromtest_tb_grade t

groupbyt.user_name

orderbyt.user_name

selectt.user_name,

sum(decode(t.course,'语文', score,null))asCHINESE,

sum(decode(t.course,'数学', score,null))asMATH,

sum(decode(t.course,'英语', score,null))asENGLISH

fromtest_tb_grade t

groupbyt.user_name

orderbyt.user_name

1.3、延伸

如果要实现对各门功课的不同分数段进行统计,效果图如下:

具体的实现sql如下:

select t2.SCORE_GP,

sum(decode(t2.course,'语文', COUNTNUM,null))asCHINESE,

sum(decode(t2.course,'数学', COUNTNUM,null))asMATH,

sum(decode(t2.course,'英语', COUNTNUM,null))asENGLISH

from(

selectt.course,

casewhent.score  <60then'00-60'

whent.score >=60andt.score <80then'60-80'

whent.score >=80then'80-100'endasSCORE_GP,

count(t.score)asCOUNTNUM

FROMtest_tb_grade t

groupbyt.course,

casewhent.score  <60then'00-60'

whent.score >=60andt.score <80then'60-80'

whent.score >=80then'80-100'end

orderbyt.course ) t2

groupbyt2.SCORE_GP

orderbyt2.SCORE_GP

selectt2.SCORE_GP,

sum(decode(t2.course,'语文', COUNTNUM,null))asCHINESE,

sum(decode(t2.course,'数学', COUNTNUM,null))asMATH,

sum(decode(t2.course,'英语', COUNTNUM,null))asENGLISH

from(

selectt.course,

casewhent.score  <60then'00-60'

whent.score >=60andt.score <80then'60-80'

whent.score >=80then'80-100'endasSCORE_GP,

count(t.score)asCOUNTNUM

FROMtest_tb_grade t

groupbyt.course,

casewhent.score  <60then'00-60'

whent.score >=60andt.score <80then'60-80'

whent.score >=80then'80-100'end

orderbyt.course ) t2

groupbyt2.SCORE_GP

orderbyt2.SCORE_GP

[二]、列转行

1.1、初始测试数据

表结构:TEST_TB_GRADE2

create

table TEST_TB_GRADE2

(

ID         NUMBER(10)notnull,

USER_NAME  VARCHAR2(20CHAR),

CN_SCOREFLOAT,

MATH_SCOREFLOAT,

EN_SCOREFLOAT

)

createtableTEST_TB_GRADE2

(

ID         NUMBER(10) notnull,

USER_NAME  VARCHAR2(20 CHAR),

CN_SCORE   FLOAT,

MATH_SCORE FLOAT,

EN_SCORE   FLOAT

)

初始数据如下图:

1.2、 如果需要实现如下的查询效果图:

这就是最常见的列转行,主要原理是利用SQL里面的union,具体的sql语句如下:

select user_name,

'语文' COURSE , CN_SCORE

as SCORE

from test_tb_grade2

unionselectuser_name,'数学'COURSE, MATH_SCOREasSCOREfromtest_tb_grade2

unionselectuser_name,'英语'COURSE, EN_SCOREasSCOREfromtest_tb_grade2

orderbyuser_name,COURSE

selectuser_name,'语文'COURSE , CN_SCOREasSCOREfromtest_tb_grade2

unionselectuser_name,'数学'COURSE, MATH_SCOREasSCOREfromtest_tb_grade2

unionselectuser_name,'英语'COURSE, EN_SCOREasSCOREfromtest_tb_grade2

orderbyuser_name,COURSE

也可以利用【insert all into ... select】来实现,首先需要先建一个表TEST_TB_GRADE3:

create

table TEST_TB_GRADE3

(

USER_NAME VARCHAR2(20CHAR),

COURSE    VARCHAR2(20CHAR),

SCOREFLOAT

)

createtableTEST_TB_GRADE3

(

USER_NAME VARCHAR2(20 CHAR),

COURSE    VARCHAR2(20 CHAR),

SCORE     FLOAT

)

再执行下面的sql:

insert

all

intotest_tb_grade3(USER_NAME,COURSE,SCORE)values(user_name,'语文', CN_SCORE)

intotest_tb_grade3(USER_NAME,COURSE,SCORE)values(user_name,'数学', MATH_SCORE)

intotest_tb_grade3(USER_NAME,COURSE,SCORE)values(user_name,'英语', EN_SCORE)

selectuser_name, CN_SCORE, MATH_SCORE, EN_SCOREfromtest_tb_grade2;

commit;

insertall

intotest_tb_grade3(USER_NAME,COURSE,SCORE)values(user_name,'语文', CN_SCORE)

intotest_tb_grade3(USER_NAME,COURSE,SCORE)values(user_name,'数学', MATH_SCORE)

intotest_tb_grade3(USER_NAME,COURSE,SCORE)values(user_name,'英语', EN_SCORE)

selectuser_name, CN_SCORE, MATH_SCORE, EN_SCOREfromtest_tb_grade2;

commit;

别忘记commit操作,然后再查询TEST_TB_GRADE3,发现表中的数据就是列转成行了。

怎么给oracle数据库列转行,oracle数据库 行转列 列转行详解相关推荐

  1. [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. python把数据写入excel_Python读写sqlite3数据库的方法并且将数据写入Excel的实例详解...

    这篇文章主要介绍了Python实现读写sqlite3数据库并将统计数据写入Excel的方法,涉及Python针对sqlite3数据库的读取及Excel文件相关操作技巧,需要的朋友可以参考下 本文实例讲 ...

  3. oracle中dual最多存多大_ORACLE中dual用法详解

    基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. Oracle中的dual表 ...

  4. oracle大对象实例_Oracle解析复杂json的方法实例详解

    问题背景: 当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析.如此 ...

  5. Oracle Database 12c RMAN全量+增量备份+归档日志恢复详解

    Oracle可以非常方便的把数据库恢复到具体某个时间的状态,而且还支持全备和多级增备,备份无需停止应用服务.比起DB2需要手动逐级恢复增量备份和归档日志,RMAN是非常简单好用的数据库商业解决方案. ...

  6. oracle表稅片整理,oracle_Oracle表碎片整理操作步骤详解,高水位线(HWL)下的许多数据 - phpStudy...

    Oracle表碎片整理操作步骤详解 高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink s ...

  7. Oracle Rac集群常用命令总结(crsctl和srvctl详解)

    一.Oracle Rac常用命令 cat /etc/hosts cd $ORACLE_HOME/bin/ 1--查询 --检查集群中各组件状态  olsnodes -s --查看集群名称 cemutl ...

  8. oracle如何启动和停止服务,CentOS启动和停止服务详解

    CentOS启动和停止服务详解 服务简介 Linux 系统服务是在Linux启 动时自动加载, 服务的添加.删除.自动运行及状态 CAMS 在安装过程中会自动添加相关的服务,例如: service c ...

  9. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...

  10. 将xscj指定为当前数据库_通过网络连接数据库模式Hive的搭建过程详解

    最近在搭建通过网络直接连接数据库模式的Hive时总是在启动的时候报各种错误,所以今天,我们来总结一下这种模式的Hive的搭建过程. [数据库安装] 安装mysql yum install mysql- ...

最新文章

  1. centos7之破解root密码
  2. RL之PG:基于TF利用策略梯度算法玩Cartpole游戏实现智能得高分
  3. go grpc测试_Grpc — 整体性能测试
  4. 实现一个函数,对一个正整数n,算得到1
  5. 为此计算机所有用户安装加载项,安装Office 2013后,无法在计算机上安装Outlook加载项...
  6. 计算机二级高级应用考题,2016计算机二级MSOFFICE高级应用考试真题
  7. 前端学习(3218):批量传递props
  8. jenkins的简介与安装
  9. asp.net数据库操作类(不含存储过程)
  10. MySQL 中的数据类型介绍
  11. VINS-Mono代码解读——视觉跟踪 feature_trackers
  12. 探索反汇编-在Linux环境下
  13. Adobe Flash被禁用和无法加载的官方解决办法
  14. 从哪里租vps远程桌面服务器,vps远程桌面服务器租一个
  15. 【023】Springboot+vue+mysql员工考勤管理系统(多角色登录、请假、打卡)(含源码、数据库、运行教程)
  16. 软件项目管理经验总结
  17. 【无标题】IP地址段必须正好可以聚合成1个地址块
  18. CTFShow re2 (RC4
  19. 深入浅出学 Vue 开发
  20. java 数组包含_灵魂拷问:如何检查 Java 数组中是否包含某个值?

热门文章

  1. 银行卡休眠状态怎么激活
  2. 图像DFT和DCT的频域真实频率
  3. html js参考手册,JavaScript 和 HTML DOM 参考手册
  4. 浏览器插件开发-常用API
  5. 极具参考价值的Python面试题!从创业公司到一线大厂的所有面经汇总
  6. 商务演讲培训Winning Keynote笔记
  7. 2020.7 Hexo手把手教程(还带视频教程)
  8. arcgis软件集合
  9. Java字符串常量池
  10. C运算符优先级完整口诀