一、行转列

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

  示例

 -- 学生成绩表
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. SQLServer学习笔记系列11

    一.写在前面的话 身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦 ...

  2. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  3. 代码的坏味道(3)——基本类型偏执(Primitive Obsession)

    坏味道--基本类型偏执(Primitive Obsession) 特征 使用基本类型而不是小对象来实现简单任务(例如货币.范围.电话号码字符串等). 使用常量编码信息(例如一个用于引用管理员权限的常量 ...

  4. javascript异步编程的前世今生,从onclick到await/async

    javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...

  5. WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】

    WCF Interview Questions – Part 4   This WCF service tutorial is part-4 in series of WCF Interview Qu ...

  6. Effective java笔记(六),方法

    38.检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有限制.如,对象引用不能为null,数组索引有范围限制等.应该在文档中指明所有这些限制,并在方法的开头处检查参数,以强制施加这些限 ...

  7. Devexpress Gantt 应用

    甘特图属于甘特系列浏览次数(也称为时间或时间轴图表).此视图显示横条沿时间轴.每个条形代表一个单独的事件的开始和结束的值, 因此,这些图是用来跟踪各种活动的时间范围内(例如计划,利用各种资源,审查该项 ...

  8. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  9. Hadoop单机伪分布式

    环境配置:Ubuntu11.10,Hadoop1.0.0 安装ssh 1 apt-get install ssh 安装rsy 1 apt-get install rsync 配置ssh免密码登录 1 ...

  10. PHP流程控制之循环结构

    计算机程序最擅长的功能之一就是按规定的条件,重复执行某些操作.循环结构可以减少源程序重复书写的工作量,即在给定条件成立时,反复执行某程序段,直到条件不成立为止.给定的条件称为循环条件,反复执行的程序段 ...