怎么给oracle数据库列转行,oracle数据库 行转列 列转行详解
[一]、行转列
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数据库 行转列 列转行详解相关推荐
- [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- python把数据写入excel_Python读写sqlite3数据库的方法并且将数据写入Excel的实例详解...
这篇文章主要介绍了Python实现读写sqlite3数据库并将统计数据写入Excel的方法,涉及Python针对sqlite3数据库的读取及Excel文件相关操作技巧,需要的朋友可以参考下 本文实例讲 ...
- oracle中dual最多存多大_ORACLE中dual用法详解
基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. Oracle中的dual表 ...
- oracle大对象实例_Oracle解析复杂json的方法实例详解
问题背景: 当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析.如此 ...
- Oracle Database 12c RMAN全量+增量备份+归档日志恢复详解
Oracle可以非常方便的把数据库恢复到具体某个时间的状态,而且还支持全备和多级增备,备份无需停止应用服务.比起DB2需要手动逐级恢复增量备份和归档日志,RMAN是非常简单好用的数据库商业解决方案. ...
- oracle表稅片整理,oracle_Oracle表碎片整理操作步骤详解,高水位线(HWL)下的许多数据 - phpStudy...
Oracle表碎片整理操作步骤详解 高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink s ...
- Oracle Rac集群常用命令总结(crsctl和srvctl详解)
一.Oracle Rac常用命令 cat /etc/hosts cd $ORACLE_HOME/bin/ 1--查询 --检查集群中各组件状态 olsnodes -s --查看集群名称 cemutl ...
- oracle如何启动和停止服务,CentOS启动和停止服务详解
CentOS启动和停止服务详解 服务简介 Linux 系统服务是在Linux启 动时自动加载, 服务的添加.删除.自动运行及状态 CAMS 在安装过程中会自动添加相关的服务,例如: service c ...
- SQL Server 行转列,列转行。多行转成一列
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...
- 将xscj指定为当前数据库_通过网络连接数据库模式Hive的搭建过程详解
最近在搭建通过网络直接连接数据库模式的Hive时总是在启动的时候报各种错误,所以今天,我们来总结一下这种模式的Hive的搭建过程. [数据库安装] 安装mysql yum install mysql- ...
最新文章
- centos7之破解root密码
- RL之PG:基于TF利用策略梯度算法玩Cartpole游戏实现智能得高分
- go grpc测试_Grpc — 整体性能测试
- 实现一个函数,对一个正整数n,算得到1
- 为此计算机所有用户安装加载项,安装Office 2013后,无法在计算机上安装Outlook加载项...
- 计算机二级高级应用考题,2016计算机二级MSOFFICE高级应用考试真题
- 前端学习(3218):批量传递props
- jenkins的简介与安装
- asp.net数据库操作类(不含存储过程)
- MySQL 中的数据类型介绍
- VINS-Mono代码解读——视觉跟踪 feature_trackers
- 探索反汇编-在Linux环境下
- Adobe Flash被禁用和无法加载的官方解决办法
- 从哪里租vps远程桌面服务器,vps远程桌面服务器租一个
- 【023】Springboot+vue+mysql员工考勤管理系统(多角色登录、请假、打卡)(含源码、数据库、运行教程)
- 软件项目管理经验总结
- 【无标题】IP地址段必须正好可以聚合成1个地址块
- CTFShow re2 (RC4
- 深入浅出学 Vue 开发
- java 数组包含_灵魂拷问:如何检查 Java 数组中是否包含某个值?