一、行转列

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

  示例

 -- 学生成绩表
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. 请求facebook授权时,返回错误

    在请求facebook授权时,返回如下错误:所提供的网址不被应用程序配置所接纳.:应用程序的设置不允许一个或多个所提供的链接.它必须与网站的URL或Canvas的URL相符,或该域必须是应用程序的一个 ...

  2. 【Java】子类的链式调用

    记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...

  3. jQuery-1.9.1源码分析系列(十五) 动画处理——外篇

    a.动画兼容Tween.propHooks Tween.propHooks提供特殊情况下设置.获取css特征值的方法,结构如下 Tween.propHooks = { _default: { get: ...

  4. 一些很棒的js代码

    本来是想放在博客园首页的,貌似篇幅不够被移除掉了.后来慢慢补上,看这篇文章吧:一些优秀的代码分析与学习[持续更新],里面的内容会持续更新,这篇文章作废了 1.jQuery初始化代码段 技术亮点:jQu ...

  5. 1.什么是Code First(EF Code First 系列)

    EF4.1中开始支持Code First .这种方式在领域设计模式中非常有用.使用Code First模式,你可以专注于领域设计,根据需要,为你一个领域的对象创建类集合,而不是首先来设计数据库,然后来 ...

  6. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  7. [SL] Silverlight + WCF Demo项目

    I:项目描述:利用 Silverlight+WCF 技术,模拟资源管理器(如图1)功能,通过地址栏输入本地文件夹路径,然后将解析出来的该目录下所有文件(夹)存储到数据库中,然后再加载到界面上显示出来: ...

  8. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  9. Asp.net 面向接口可扩展框架之核心容器(含测试代码下载)

    新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘 ...

  10. 在DOS使用SVN之执行命令整理(TortoiseProc.exe)

    原文链接: http://www.cnblogs.com/andrew-blog/archive/2012/08/21/SVN_DOS_Commands.html TortoiseSVN因为所有的命令 ...