Oracle行列互换 横表和纵表
/*
在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换.
比如有如下数据:
ID NAME KECHENG CHENGJI
-- ---------- -------------------- -------
1 a 语文 80
2 a 数学 70
3 b 语文 40
4 b 数学 100
5 c 语文 90
6 c 数学 92
那末我要求显示的结果是:
NAME YUWEN SHUXUE
---------- ---------------------- ----------------------
a 80 70
也就是说把课程这一列放到行上显示.把成绩按照课程分配到相对应的行.
我只介绍2中简单易用的方法,使用游标或者建立临时表的方法就不介绍了.效率很慢,不易理解.
首先建立表:
*/ create table fzq
(
id varchar(),
name varchar(),
kecheng varchar(),
chengji varchar()
); --插入数据:
insert into fzq values ('','a','语文','');
insert into fzq values('','a','shuxue','');
insert into fzq values ('','b','yuwen','');
insert into fzq values ('','b','shuxu','');
insert into fzq values ('','c','yuwen','');
insert into fzq values ('','c','shuxu',''); /*首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.*/ select name,sum(yuwen) yuwen,sum(shuxue) shuxue from
(
select name,chengji yuwen,'' shuxue from fzq
where kecheng='yuwen' union
select name,'' yuwen,chengji shuxue
from fzq
where kecheng='shuxue'
) aaa
group BY name; /*执行结果:
NAME YUWEN SHUXUE
---------- ---------------------- ----------------------
a 80 70
b 40 100
c 90 92
*/
/*
其次是用case.这种方法代码比较短.适合列值很多的情况.
*/ select name, sum(case kecheng when 'yuwen' then chengji end) yuwen,
sum(case kecheng when 'shuxue' then chengji end) shuxue
from fzq
group by name; /*执行结果:
NAME YUWEN SHUXUE
---------- ---------------------- ----------------------
a 80 70
b 40 100
c 90 92
所有例子在oracle中测试,sql server没有测试,请根据实际情况修改 如果有更好的方法,欢迎交流.
*/
横表和纵表


第一张图就是横表,一行表示了一个实体记录,这就是我们传统的设计表的形式
第二张图就是纵表,他的一行记录,是用于表示某个学生的属性名和属性值对应关系,像这边有两个属性(名字和性别),在纵表中就要用两条记录来表示一个学生。
从上面可以观察出,横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。
在实际开发中,经常需要互相转换横表和纵表的形式,这里贴个从纵表数据转成横表显示的形式。
纵表转横表
sql代码:
Select student_no,
max(decode(field_name,'student_name',field_value)) As student_name,
max(decode(field_name,'student_sex',field_value )) As student_sex
From cuc_student_y Group By student_no;
Oracle行列互换 横表和纵表的更多相关文章
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- ORACLE 横表与纵表
一.横表和纵表 横表:通常指我们平时在数据库中建立的表,是一种普通的建表方式. (主键.字段1.字段2......)如:时间.客户ID,基本通话费.漫游通话费,国内长途费.国际长途费... ...
- SQL 查询横表变竖表
SQL 查询横表变竖表 /*普通行列转换 假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 ...
- (总结)Oracle 11g常用管理命令(用户、表空间、权限)
1.启动oracle数据库: 从root切换到oracle用户进入:su - oracle 进入sqlplus环境,nolog参数表示不登录:sqlplus /nolog 以管理员模式登录:sqlpl ...
- Oracle中如何实现Mysql的两表关联update操作
在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...
- oracle数据库_实例_用户_表空间之间的关系(转)
数据库:Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库.可 ...
- oracle表结构和表内容差异比对
oracle表结构和表内容差异比对 oracle中有三种集合操作,他们会把左边和右边的select 结果集进行集合操作. union 并集 intersect 交集 minus 差集 假设有如下两张表 ...
- oracle创建表之前判断表是否存在,如果存在则删除已有表
Mysql 创建表之前判断表是否存在,如果存在则删除已有表 DROP TABLE IF EXISTS sys_area; CREATE TABLE sys_area ( id int NOT NULL ...
- ORACLE创建表之前判断表是否存在与SQL Server 对比使用
在SQL Server 数据库中,我们在创建表之前删除表,有if exit()这样的语句,但是在oracle中却没有.如果直接使用drop table那么如果表不存在会报错,导致后续语句无法运行.因此 ...
随机推荐
- 关联式容器(associative containers)
关联式容器(associative containers) 根据数据在容器中的排列特性,容器可分为序列式(sequence)和关联式(associative)两种. 标准的STL关联式容器分为set( ...
- HDU 1695 GCD (容斥原理+欧拉函数)
题目链接 题意 : 从[a,b]中找一个x,[c,d]中找一个y,要求GCD(x,y)= k.求满足这样条件的(x,y)的对数.(3,5)和(5,3)视为一组样例 . 思路 :要求满足GCD(x,y) ...
- spring webservice 开发demo (实现基本的CRUD 数据库采用H2)
在实现过程中,遇到两个问题: 1: schema 写错: 错误: http://myschool.com/schemas/st 正确: http://myschool.com/st/schemas ...
- MAC OS JAVA环境变量配置
在 /etc/profile 中 加上这些 #临时提权 sudo su #输入密码 vi /etc/profile #配置JAVA_HOME,此处路径根据自己的版本填写 JAVA_HOME=&quo ...
- Android中使用HTTP和HttpClient进行通信
/** * 使用HTTP的Get方式进行数据请求 */ protected void httpGet() { /** * 进行异步请求 */ new AsyncTask<String, Void ...
- Project Euler 97 :Large non-Mersenne prime 非梅森大素数
Large non-Mersenne prime The first known prime found to exceed one million digits was discovered in ...
- 【mongoDB运维篇①】用户管理
3.0版本以前 在mongodb3.0版本以前中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据库.即 use admin , 相当于进入超级用户管理模式,mongo ...
- Web 技术人员需知的Web 缓存知识
最近的译文距今已有4年之久,原文有一定的更新.今天踩着前辈们的肩膀,再次把这篇文章翻译整理下.一来让自己对web缓存的理解更深刻些,二来让大家注意力稍稍转移下,不要整天HTML5, 面试题啊叨啊叨的~ ...
- Java API —— Set接口 & HashSet类 & LinkedHashSet类
1.Set接口 1)Set接口概述 一个不包含重复元素的 collection,无序(存储顺序和取出顺序不一致),唯一. (List有序,即存储顺序和取出顺序一致,可重复) ...
- ios7新增基础类库以及OC新特性
新特性: Modules:用XCode5新建工程默认支持modules编译,老项目需在Build Settings里查找modules,找到的Enable Modules选项设置为YES. 对应新增语 ...