一、行转列

  在有些应用场景中,如学生成绩。学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列。

  示例

 -- 学生成绩表
create table grade (
id varchar2(64) not null,
name varchar2(20) not null,
course varchar2(100) not null,
score number(3) not null,
primary key (id)
) -- 初始化数据
insert into grade values( '', '张三', '语文', 75);
insert into grade values( '', '张三', '数学', 80);
insert into grade values( '', '张三', '英语', 80); insert into grade values( '', '李四', '语文', 86);
insert into grade values( '', '李四', '数学', 66);
insert into grade values( '', '李四', '英语', 81); insert into grade values( '', '王五', '语文', 92);
insert into grade values( '', '王五', '数学', 78);
insert into grade values( '', '王五', '英语', 82); insert into grade values( '', '赵六', '语文', 80);
insert into grade values( '', '赵六', '数学', 90);
insert into grade values( '', '赵六', '英语', 77); insert into grade values( '', '李明', '语文', 69);
insert into grade values( '', '李明', '数学', 75);
insert into grade values( '', '李明', '英语', 80);

  行转列语句

 select
t.name "姓名",
sum(decode(t.course, '语文', t.score , 0)) "语文",
sum(decode(t.course, '数学', t.score , 0)) "数学",
sum(decode(t.course, '英语', t.score , 0)) "英语"
from grade t
group by t.name

  因为这里使用到了 group by t.name,所以对于要展示score只能使用聚合函数(sum,max,min)都可以,如果不使用聚合函数就会报错。

  执行结果如下:

  

二、列转行

  与行转列相反,有些场景刚好需要这种操作。

  示例如下:

 --列转行
create table sc_grade (
id varchar2(64) not null,
name varchar2(20) not null,
cn_score number(3) not null,
math_score number(3) not null,
en_score number(3) not null,
primary key (id)
) --初始数据
insert into sc_grade values ('', '张三', 75, 80, 80);
insert into sc_grade values ('','王五', 92, 78, 82);
insert into sc_grade values ('','赵六', 80, 90, 77);
insert into sc_grade values ('','李四', 86, 66, 81);
insert into sc_grade values ('','李明', 69, 75, 80);

   列传行语句

 select name "姓名" , '语文' course, cn_score as score from sc_grade
union
select name "姓名" , '数学' course, math_score as score from sc_grade
union
select name "姓名" , '英语' course, en_score as score from sc_grade
order by "姓名" , course

  结果如下:

  

  也可以使用insert all .. into完成。使用insert all ..。 into 需要新建一个表用来保存转换后的数据。

  表结构如下:

 -- 结果存放表
create table test_sc_grade (
name varchar2(20) not null,
course varchar2(100) not null,
score number(3) not null
)

  执行语句如下:

 insert all
into test_sc_grade(name,course,score) values(name, '语文', cn_score)
into test_sc_grade(name,course,score) values(name, '数学', math_score)
into test_sc_grade(name,course,score) values(name, '英语', en_score)
select name, cn_score, math_score, en_score from sc_grade;
commit;
select * from test_sc_grade

  结果查询与上面截图一致。

oracle行转列与列转行的更多相关文章

  1. oracle 行转列、列转行

    最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max ...

  2. oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...

  3. Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...

  4. [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行

    原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...

  5. Oracle行转列/列转行

    1.oracle的pivot函数 原表 使用pivot函数: with temp as(select '四川省' nation ,'成都市' city,'第一' ranking from dual u ...

  6. oracle 行转列~列转行(几种方法)

    工作中,我们经常会碰到行转列的情况 这里我介绍几种简单的方法--行转列 1.oracle的pivot函数 原表 使用pivot函数: with temp as(select '四川省' nation ...

  7. Oracle行转列,列转行,行列相互转换

    1.行转列 SELECT WM_CONCAT(COLUMN_NAME) COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'T_CREATE_T ...

  8. 做图表统计你需要掌握SQL Server 行转列和列转行

    说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...

  9. SQL 行转列和列转行

    SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...

  10. SQLServer处理行转列和列转行

    掌握SQL Server 行转列和列转行 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 ...

随机推荐

  1. Cesium原理篇:6 Render模块(3: Shader)

    在介绍Renderer的第一篇,我就提到WebGL1.0对应的是OpenGL ES2.0,也就是可编程渲染管线.之所以单独强调这一点,算是为本篇埋下一个伏笔.通过前两篇,我们介绍了VBO和Textur ...

  2. PHP中常见魔术方法解析

    <?php class info { private $province; //省 public $city; //城市 private $myname; //姓名 //__construct( ...

  3. 归一化变换 Normalizing transformations

    归一化变换包含两个部分,图像坐标的平移和尺度的缩放.进行归一化的变换不但能够提高处理结果的精确度,而且通过选择一个标准的坐标系预先的消除了图像尺度和坐标原点的选择对算法最终结果的影响. 归一化变换的步 ...

  4. 如何设置 Panorama 控件的只读 SelectedIndex 属性?

    在 OnNavigatedTo() 方法中设置: panoramaControl.DefaultItem = panoramaControl.Items[indexToSet];

  5. [PHP]Maximum execution time of 30 seconds exceeded

    前言 在使用PHP渲染页面页面的时候,如果程序处理的时间特别久,超过配置文件(php.ini)设置的超时时间,就会出现如下提示: Maximum execution time of 30 second ...

  6. [WCF编程]9.性能与限流

    一.性能概述 WCF服务的性能取决于很多因素.出了CPU.RAM和网络性能等常见的因素外,实例上下文模式.并发模式.数据契约的设计或使用的绑定等与WCF有关的因素都起着重要的作用. 实例上下文模式用来 ...

  7. js 与JQuery显示及隐藏方法

    虽然以后两种方式都能让文本信息隐藏和显示 第一种文本隐藏以后还是会占居位置, 第二种则不会占位置. <p id="p1">这是一段文本.</p> <i ...

  8. 4、python列表

    1.末尾追加:append() s = ["a", "b", "c"] print(s) #['a', 'b', 'c'] s.append ...

  9. Gym 100703I---Endeavor for perfection(尺取)

    题目链接 http://codeforces.com/problemset/gymProblem/100703/I Description standard input/outputStatement ...

  10. ftp 根据特定正则匹配文件名 下载到本地 并且上传文件到ftp java *** 最爱那水货

    /** * 建立FTP链接,FTP服务器地址.端口.登陆用户信息都在配置里配置即可. * @throws IOException */ public boolean connectFtp(String ...