横表就是普通的建表方式,如一个表结构为:
主键、字段1、字段2、字段3。。。
如果变成纵表后,则表结构为:
主键、字段代码、字段值。
而字段代码则为字段1、字段2、字段3。
纵表对从数据库到内存的映射效率是有影响的,但细一点说也要一分为二:
纵表的初始映射要慢一些;
纵表的变更的映射可能要快一些,如果只是改变了单个字段时,毕竟横表字段比纵表要多很多。
横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应 该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。
测试例子:
create table a(name varchar2(12),
math number,
englist number,chinese number);
插入两行记录:
张三 85 90 95
李四 90 85 86
转行查询语句:
SELECT flag, MAX(李四) AS 李四, MAX(张三) AS 张三
FROM (SELECT decode(NAME, '李四', fensu) as 李四,
decode(NAME, '张三', fensu) AS 张三,
flag
FROM (SELECT a.NAME, a.math AS fensu, 'math' AS flag
FROM a
UNION ALL
SELECT a.NAME, a.englist AS fensu, 'englist' AS flag
FROM a
UNION ALL
SELECT a.NAME, a.chinese AS fensu, 'chinese' AS flag FROM a) b
ORDER BY NAME, flag, fensu)
GROUP BY flag
现有emp和dept表
EMP
empno number(4)
ename varchar2(10)
job varchar2(9)
mgr number(4)
hiredate date
sal number(7,2)
comm number(7,2)
deptno number(2)
DEPT
deptno number(2)
dname varchar2(14)
loc varchar2(13)
统计不同部门和工作的员工的总工资
实现横标转换为纵表
decode实现
select d.dname dname,
sum(decode(e.job, 'CLERK', e.sal, 0)) CLERK,
sum(decode(e.job, 'SALESMAN', e.sal, 0)) SALESMAN,
sum(decode(e.job, 'ANALYST', e.sal, 0)) ANALYST,
sum(decode(e.job, 'MANAGER', e.sal, 0)) MANAGER,
sum(decode(e.job, 'PRESIDENT', e.sal, 0)) PRESIDENT
from emp e
join dept d
on e.deptno = d.deptno
group by d.dname;
case when实现
select d.dname dname,
sum(
case e.job
when 'CLERK' then e.sal
else 0
end
) CLERK,
sum(
case e.job
when 'SALESMAN' then e.sal
else 0
end
) SALESMAN,
sum(
case e.job
when 'PRESIDENT' then e.sal
else 0
end
) PRESIDENT,
sum(
case e.job
when 'MANAGER' then e.sal
else 0
end
) MANAGER,
sum(
case e.job
when 'ANALYST' then e.sal
else 0
end
) ANALYST
from emp e
join dept d
on e.deptno = d.deptno
group by d.dname;
带合计项的
select d.dname dname,
sum(decode(e.job, 'CLERK', e.sal, 0)) CLERK,
sum(decode(e.job, 'SALESMAN', e.sal, 0)) SALESMAN,
sum(decode(e.job, 'ANALYST', e.sal, 0)) ANALYST,
sum(decode(e.job, 'MANAGER', e.sal, 0)) MANAGER,
sum(decode(e.job, 'PRESIDENT', e.sal, 0)) PRESIDENT
from emp e
join dept d on e.deptno = d.deptno
group by d.dname
union
select '总计' dname,
sum(decode(e.job, 'CLERK', e.sal, 0)) CLERK,
sum(decode(e.job, 'SALESMAN', e.sal, 0)) SALESMAN,
sum(decode(e.job, 'ANALYST', e.sal, 0)) ANALYST,
sum(decode(e.job, 'MANAGER', e.sal, 0)) MANAGER,
sum(decode(e.job, 'PRESIDENT', e.sal, 0)) PRESIDENT
from emp e
join dept d2 on e.deptno = d2.deptno
分享到:
相关推荐
横表转纵表亦可用与decode意义相似的case语句实现,原理同该语句,这里不再过多描述。
3、使用Oracle存储过程实现横表转纵表结构,无需繁琐的手动操作,一键执行,适合处理大批量数据转换任务,极大提升数据处理效率。 4、资源中提供了自己验证需要的业务数据、数据库表DDL脚本,可验证学习。 5、本内容...
使用oracle数据库时修改表结构,创建表空间等等
在 FROM 子句中包含多个表的情况下,需要选择记录条数最少的表作为基础表。 2. 使用绑定变量 在 Oracle 中,使用绑定变量可以提高多表连接的效率。绑定变量可以减少 SQL 语句的解析时间和内存的使用。 3. 使用...
oracle锁表查询oracle锁表查询oracle锁表查询oracle锁表查询
如何在Oracle数据表中随机抽取部分记录的方法
ORACLE 数据库中如何统计表记录数的过程说明
oracle查询表碎片语句
oracle 系统表大全oracle 系统表大全oracle 系统表大全oracle 系统表大全
在程序设计过程中,往往遇到比较两个记录集的差异。如,判断原来传入的订单资料与后来传入的订单资料之间的差异,并且将差异的...本文主要论述利用ORACLE的MINUS函数和OVER函数,直接通过视图实现两个记录集的比较。
ORACLE表生成MYSQL建表DDL
有做数据库巡检的同学,资料来啦,填空就可以喽
主要介绍了oracle普通表转化为分区表的方法,官方给出了四种操作方法,本文主要对第四种方法进行详细分析,需要的朋友可以参考下。
Oracle测试表及数据.txt
很好的,经典.创建Oracle 临时表,可以有两种类型的临时表:会话级的临时表,事务级的临时表 。
oracle 多表查询与数据修改学习笔记,主要是让大家熟悉三个或四个表的连接查询,熟练掌握delete、update与insert的语法。
oracle 判断表 是否存在.亲自手写可用才上传的。
国家,洲Oracle数据表,已通过测试。包括国家名,所属大洲(用于关联查询),简称,国际代码,全称。
Hash分区是Oracle实现表分区的三种基本分区方式之一。对于那些无法有效划分分区范围的大表,或者出于某些特殊考虑的设计,需要使用Hash分区,下面介绍使用方法
Oracle分区表详解 大家可以参考下 网上找的资料共享一下