oracle 多行转一行数据处理

问题描述

oracle 多行转一行数据处理
    一月  二月  三月

张三 语文 30 40 50
张三 数学 56 65 78
张三 英语 28 86 48
李四 语文 31 41 51
李四 数学 57 66 79
李四 英语 29 87 49

转换成
1月语文 一月数学 一月英语 二月语文 二月数学 二月英语 三月语文 三月数学 三月英语
张三 30 56 28 40 65 86 50 78 48
李四 31 57 29 41 66 87 51 79 49

解决方案

 CREATE TABLE GRADE_TABLE(
   STU_NAME VARCHAR(20),
   SUBJECT VARCHAR(20),
   MONTH1 INT DEFAULT 0, --一月
   MONTH2 INT DEFAULT 0,--二月
   MONTH3 INT DEFAULT 0
);
insert into GRADE_TABLE(STU_NAME,SUBJECT,MONTH1,MONTH2,MONTH3) values('张三','语文','30','40','50');
insert into GRADE_TABLE(STU_NAME,SUBJECT,MONTH1,MONTH2,MONTH3) values('张三','数学','56','65','78');
insert into GRADE_TABLE(STU_NAME,SUBJECT,MONTH1,MONTH2,MONTH3) values('张三','英语','28','86','48');
insert into GRADE_TABLE(STU_NAME,SUBJECT,MONTH1,MONTH2,MONTH3) values('李四','语文','31','41','51');
insert into GRADE_TABLE(STU_NAME,SUBJECT,MONTH1,MONTH2,MONTH3) values('李四','数学','57','66','79');
insert into GRADE_TABLE(STU_NAME,SUBJECT,MONTH1,MONTH2,MONTH3) values('李四','英语','29','87','49');
--执行SQL
select stu_name,sum(一月语文 ) 一月语文 ,sum(二月语文 ) 二月语文,sum(三月语文 ) 三月语文
,sum(一月数学 ) 一月数学 ,sum(二月数学 ) 二月数学,sum(三月数学 ) 三月数学
,sum(一月英语 ) 一月英语 ,sum(二月英语 ) 二月英语,sum(三月英语 ) 三月英语
from(
select stu_name,sum(case subject when '语文' then month1 end) as 一月语文
,sum(case subject when '语文' then month2 end) as 二月语文
,sum(case subject when '语文' then month3 end) as 三月语文
,sum(case subject when '数学' then month1 end) as 一月数学
,sum(case subject when '数学' then month2 end) as 二月数学
,sum(case subject when '数学' then month3 end) as 三月数学
,sum(case subject when '英语' then month1 end) as 一月英语
,sum(case subject when '英语' then month2 end) as 二月英语
,sum(case subject when '英语' then month3 end) as 三月英语
from GRADE_TABLE
group by stu_name,subject
) group by stu_name
时间: 2024-12-21 13:31:14

oracle 多行转一行数据处理的相关文章

oracle多行重复去重只显示一行,怎么实现??

问题描述 oracle多行重复去重只显示一行,怎么实现?? 解决方案 select name, max(lttype_id) from table group by name 解决方案二: 嗯 这个语句可以查出来我想要的结果,那order by id 应该加在哪里? 解决方案三: group by name,按name分组,,或者select distinct name 解决方案四: select distinct name from table;按照你的要就,以上就行了

浅谈Oracle的行级锁

㈠ 单实例Oracle locking机制 locking机制的三大组成部分: ① resource structure Oracle对于每个需要"并发访问"的资源,都在SGA中用一个数据结构来描述它 这个结构叫resource structure 这个数据结构有三个成员:owner.waiter和converter 这是3个指针 指向由lock structure组成的链表的指针 其中,converter和waiter有些区别: 如果某个操作先后需要两种不同模式的锁,比如,先S,后X

sql-SQL查询显示多行变一行

问题描述 SQL查询显示多行变一行 如图一数据表中的结果为: 想要显示为图二: 如何实现? 解决方案 select 名称, sum(decode(项目编码, '1', 得分)) 第一项得分, sum(decode(项目编码, '2', 得分))第二项得分, ..., sum(decode(项目编码, '15', 得分))第十五项得分, from 表名 group by 名称 解决方案二: 数据一行变多行的SQL查询SQL实现多行变一行多行变一行 解决方案三: select 名称, sum(cas

c#+oracle数据库行锁写法问题

问题描述 c#+oracle数据库行锁写法问题 请教各位高手: 我在c#+oracle,里面,想如此操作.当修改某一数据的前,先执行select行锁定,待修改完毕后再解锁.请问在不用存储过程的情况下,程序该如何写呢? 解决方案 最简单的是使用事务.http://www.cnblogs.com/yanghucheng/archive/2013/01/25/2876492.htmlhttp://happypigs.iteye.com/blog/1576282 解决方案二: 谢谢,能举个实际例子吗 解

oracle命令行删除与创建用户的代码_oracle

oracle命令行删除用户:  复制代码 代码如下:  connect / as sysdba;    shutdown abort;    startup;    drop user user1 cascade;    exit oracle命令行创建用户:     复制代码 代码如下: create user user1     identified by values 'fa091872a2cc669c'     default tablespace user1     temporary

oracle的行迁移和行链接

定义: 行迁移:因为update.将行变长.原来的块已经放不下了.行被挪进新块. 行链接:行一开始就太大.比如你插入了1w个字节的行.必须要分两个块存放. 由此.行变长的时间先后可作为判断依据 产生场景: 行迁移 Oracle会将整行的数据迁移到一个新的数据块上,而将该行原先的空间只放一个指针,指向该行的新的位置,并且该行原先空间的剩余空间不再被数据库使用,这些剩余的空间我们将其称之为空洞,这就是产生表碎片的主要原因,表碎片基本上也是不可避免的,但是我们可以将其降到一个我们可以接受的程度.注意,

3年前oracle命令行笔记,到现在还常用。

col 列名 for(mat) 格式 :可对列进行格式化(a100 是针对varchar 的格式,显示100个字符,可以a60,a80), 例如:col file_name format a100; col 列名:显示当前列的格式 clear column:清除所有列的格式 //主機名 HOST HOSTNAME; //幫助 HELP INDEX; //顯示當前環境變量值 SHOW ALL //顯示當前錯誤 SHOW ERR; //顯示數據庫版本 show rel //查看oracle版本 CO

拨云见日—深入解析Oracle TX 行锁(上)

在刚刚过去不久的第七届数据技术嘉年华上,性能优化专家怀晓明老师进行了Oracle性能优化的主题分享.在他多年的优化生涯中,一直遵守的优化理念是,平衡是唯一的核心.我们整理了怀老师大会的演讲内容,今天一起来学习,如何在实践中应用这一理念并实现有效的性能优化. 演讲实录 优化的核心思想是平衡.在数据库的运行中,平衡取决于三个方面: 需求:指的是要做什么: 资源:是系统中所能提供的内容: 实现:指的是为了满足需求,应该如何利用提供的资源. 只有三者达到平衡,系统才能够高效地运行. 今天的内容将会通过O

Oracle针对数据库某一行进行操作的时候,如何将这一行加行锁_oracle

select for update 这个是行级锁 当 commit或者rollback时,锁释放 记得打开事务,比如jdbc里面 setAutoCommit(false); 步骤如下: 1 在JDBC中setAutoCommit为false 2 在Oracle中查询,使用for update字句,锁定所有select出来的记录行 3 执行所需操作 4 con.commit()以上事务 完毕.