`

Oracle 横表、纵表一点记录

 
阅读更多

横表就是普通的建表方式,如一个表结构为:
主键、字段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

 

现有empdept

 

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

 

 

分享到:
评论

相关推荐

    Oracle数据库实战:一键执行批量将横表转纵表(横向表转纵向表)

    3、使用Oracle存储过程实现横表转纵表结构,无需繁琐的手动操作,一键执行,适合处理大批量数据转换任务,极大提升数据处理效率。 4、资源中提供了自己验证需要的业务数据、数据库表DDL脚本,可验证学习。 5、本内容...

    Oracle 数据显示 横表转纵表

    本文将详细介绍如何在Oracle中使用DECODE和CASE语句进行横表转纵表的操作。 首先,我们需要理解横表和纵表的概念。横表是列数多行数少的数据结构,而纵表则是行数多列数少,通常用于将具有相同类别但不同属性的数据...

    oracle查看表历史记录-Oracle查看表操作历史记录并恢复.pdf

    Oracle 查看表历史记录和恢复 Oracle 数据库是一种关系型数据库管理系统,具有强大的数据存储和管理能力。然而,在实际操作中,数据库管理员或开发者可能会不小心删除了重要数据,这时候如何恢复这些数据成了一个...

    oracle修改表结构

    在Oracle数据库管理中,对表结构进行修改是一项常见的任务,涉及到添加字段、修改字段属性、删除字段、重命名表或字段、以及注释等操作。以下是对这些操作的详细解析: ### 添加字段 使用`ALTER TABLE`语句可以向...

    Oracle 多表查询优化

    在 FROM 子句中包含多个表的情况下,需要选择记录条数最少的表作为基础表。 2. 使用绑定变量 在 Oracle 中,使用绑定变量可以提高多表连接的效率。绑定变量可以减少 SQL 语句的解析时间和内存的使用。 3. 使用...

    ORACLE技巧 - 不同记录集的横向合并

    ### ORACLE技巧 - 不同记录集的横向合并 #### 概述 在处理数据库操作时,经常需要对比两个记录集的差异,例如比较原先输入的订单数据与之后更新的订单数据之间的不同之处,并将这些差异展示给用户查看。在Oracle...

    ORACLE统计表记录数

    ORACLE 数据库中如何统计表记录数的过程说明

    查看登录oracle数据库用户记录.docx

    要查看登录 Oracle 数据库的用户记录,可以创建一个临时日志表,并建立一个数据库表触发器来记录用户的登录行为。 创建临时日志表 首先,需要创建一个临时日志表来存储用户的登录记录。可以使用以下 SQL 语句来...

    Oracle删除表中的重复数据

    在Oracle中删除表中的重复数据,可以采用多种策略,但通常涉及创建一个临时表来保存去重后的数据,然后用这个临时表覆盖原始表。这种方法可以避免直接修改原表带来的风险,确保操作的安全性。以下是一种具体的实现...

    Oracle复制表数据的两种用法

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了多种方式来复制表数据。在本文中,我们将深入探讨Oracle复制表数据的两种主要方法,并结合提供的“测试插入.sql”文件,理解其在实际操作中的应用。 首先...

    Oracle临时表空间不足和批处理缓慢问题探讨.pdf

    Oracle 临时表空间不足和批处理缓慢问题探讨 本文探讨了 Oracle 临时表空间不足和批处理缓慢问题的原因和解决方法。通过分析和测试,发现了问题的根源在于应用逻辑方面,具体来说是 SQL 语句的编写问题。通过编写...

    批量获取oracle数据表记录信息

    批量获取Oracle数据表记录信息是一项常见的需求,对于数据库管理员和开发者来说,能够有效地监控和管理数据库资源至关重要。下面将详细讲解如何通过ADO(ActiveX Data Objects)连接Oracle数据库,获取所有表名、...

    Oracle测试表及数据.txt

    Oracle测试表及数据.txt

    ORACLE多表查询优化

    在 FROM 子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。 2. 使用 Cache Buffer Oracle 的 Cache Buffer 功能可以大大提高 SQL 的执行性能并节省内存的使用。数据库管理员必须在 init.ora 中为这...

    Oracle数据库删除表中重复记录的方法三则.txt

    ### Oracle数据库删除表中重复记录的方法 在Oracle数据库管理中,经常会遇到需要处理表中的重复数据的情况。重复数据不仅会占用不必要的存储空间,还可能导致数据统计错误或业务逻辑混乱等问题。因此,掌握如何有效...

    oracle判断表是否存在.

    oracle 判断表 是否存在.亲自手写可用才上传的。

    Oracle数据库表生成C#实体类

    "Oracle数据库表生成C#实体类"是一个实用的小工具,它的主要目的是自动化这个过程,避免开发者手动编写繁琐的实体类代码。虽然这个工具可能存在一些小问题,但它可以大大提高开发效率,尤其是在处理大量表结构时。 ...

    oracle定时删除表空间的数据并释放表空间

    在Oracle数据库管理中,定期清理和优化表空间是至关重要的任务,这有助于保持数据库的高效运行和合理利用存储资源。本文将深入探讨如何在Oracle环境中实现定时删除表空间的数据并释放空间,主要涵盖以下几个关键知识...

Global site tag (gtag.js) - Google Analytics