一、行转列

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

  示例

 -- 学生成绩表
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. js实现可拖拽的div

    前言 下午忙里偷闲想写一个可拖拽的例子,留在脑海里一直都是三个事件mouseDown,mouseUp,mouseMove, 但从没有动手实践过,今天想起了自己实践了并学习了张鑫旭的demo实现. 学习 ...

  2. Mysql并发时经典常见的死锁原因及解决方法

    1.    mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁 ...

  3. QT 中 关键字讲解(emit,signal,slot)

    Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法.作为一种通用的处理机制,信号与反应槽非常灵活,可以携 ...

  4. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  5. 使用abp模板创建解决方案

    前言 ABP官网(http://www.aspnetboilerplate.com/),本地环境 sql server EXPRESS +vs2013 通过官网生成 module zero 解决方案模 ...

  6. swift相关

    1.界面上一个输入框,一个按钮,一个webview .点按钮,webview显示输入框中输入的url的页面. @IBOutlet var wv:UIWebView = nil          //定 ...

  7. jquery css事件编程 位置 操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. ListView的CheckBox实现全部选中/不选中

    在Adapter类中定义一个HashMap列表,保存每一行是否被选中: private static HashMap<Integer, Boolean> isSelected; 可见定义了 ...

  9. linux下c程序的链接、装载和库(2)

    5. 重定义错误. 一个最终的可执行文件里,绝对不允许出现两个同名的全局变量,也不允许出现同名的全局函数. 全局函数:只要不用 static 修饰符修饰的函数,全部都是全局的. 全局变量:函数外声明定 ...

  10. [moka同学笔记]八、Yii2.0课程笔记(魏曦老师教程)[授权]

    数据库表创建 在执行yii rbac/init之前,需要在 \console\controllers\RbacController.php中 <?php namespace console\co ...