Oracle中纵横表的转化

时间:2021-09-01 23:47:49

横表就是普通的建表方式,如一个表结构为:主键、字段1、字段2、字段3......如果变成纵表后,

则表结构为:主键、字段代码、字段值。而字段代码则为字段1、字段2、字段3。

纵表对从数据库到内存的映射效率是有影响的,但细一点说也要一分为二:纵表的初始映射要慢一些;

纵表的变更的映射可能要快一些,如果只是改变了单个字段时,毕竟横表字段比纵表要多很多。

横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。

对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,

但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者各有利弊。

实际工作中,我们经常会遇到纵横表的转化,很简单的例子,假设有张学生成绩表(zb)如下:

Oracle中纵横表的转化

我现在我需要得到如下的数据

Oracle中纵横表的转化

如何才能实现呢,这就需要用到我们上次说的DECODE或者CASE来实现。

select name 姓名,

  max(case subject when '语文' then result else 0 end) 语文,

  max(case subject when '数学' then result else 0 end) 数学,

  max(case subject when '物理' then result else 0 end) 物理

from zb

group by name;

select name 姓名,

       max(decode(subject, '语文', result, 0)) 语文,

       max(decode(subject, '数学', result, 0)) 数学,

       max(decode(subject, '物理', result, 0)) 物理

  from zb

 group by name;

这两个语句都可以实现我们的需求。

同样的,如果我们的成绩表(hb)是:

Oracle中纵横表的转化

而要求得到的是

Oracle中纵横表的转化

的话,

select *

  from (select 姓名 as Name, '语文' as Subject, 语文 as Result

          from hb

        union all

        select 姓名 as Name, '数学' as Subject, 数学 as Result

          from hb

        union all

        select 姓名 as Name, '物理' as Subject, 物理 as Result

          from hb) t

 order by name,

          case Subject

            when '语文' then

             1

            when '数学' then

             2

            when '物理' then

             3

          end;

此时我们还可以增加总分,平均分的字段:

select *

  from (select 姓名 as Name, '语文' as Subject, 语文 as Result

          from hb

        union all

        select 姓名 as Name, '数学' as Subject, 数学 as Result

          from hb

        union all

        select 姓名 as Name, '物理' as Subject, 物理 as Result

          from hb

        union all

        select 姓名 as Name,

               '平均分' as Subject,

               cast((语文 + 数学 + 物理) * 1.0 / 3 as decimal(18, 2)) as Result

          from hb

        union all

        select 姓名 as Name, '总分' as Subject, 语文 + 数学 + 物理 as Result

          from hb) t

 order by name,

          case Subject

            when '语文' then

             1

            when '数学' then

             2

            when '物理' then

             3

            when '平均分' then

             4

            when '总分' then

             5

          end;

以上就是所谓的纵横表的转化。

Oracle中纵横表的转化的更多相关文章

  1. 【转】Oracle中dual表的用途介绍

    原文:Oracle中dual表的用途介绍 [导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表, ...

  2. oracle 中删除表 drop delete truncate

    oracle 中删除表 drop delete truncate   相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名 ...

  3. 如何在Oracle中建立表和表空间?

    1.建表空间 ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方 ...

  4. 向oracle中的表插入数据的方法

    向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:s ...

  5. Oracle中truncate表不更新last_ddl_time列

    Oracle中truncate表不更新last_ddl_time列 问题描述 最近发现数据库中定时job的某张表,每天都有truncate动作,由于调整了job的interval时间,想查看last_ ...

  6. Oracle中改变表的Owner和tablespace

    初用Oracle,很多的不熟悉,建完库,没有建用户,也没创建表空间,就直接system用户建表添加数据,几个月过去,表建了近百个,数据添加了几万条,才越来越觉得这种方式缺点太多: 在PL/SQL中系统 ...

  7. Oracle中dual表的用途介绍

    导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情.     dual是一个虚拟表,用来构成select的语法规则,or ...

  8. ORACLE中修改表的Schema的总结

    前阵子遇到一个案例,需要将数据库中的几个表从USER A 移动到USER B下面,在ORACLE中,这个叫做更改表的所有者或者修改表的Schema.其实遇到这种案例,有好几种解决方法.下面我们通过实验 ...

  9. Oracle中dual表的用途介绍-转

    读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表,用来构成select的语法规则,oracle保 ...

随机推荐

  1. 自己动手写计算器v1.0

    今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...

  2. 一个最小化的SpringBoot项目

    项目结构 项目基于Maven管理,注意使用了父pom <parent> <groupId>org.springframework.boot</groupId> &l ...

  3. C语言文法定义与C程序的推导过程

    program à external_declaration | program external_declaration <程序> ->  <外部声明> |  < ...

  4. 5&period;cadence原理图上&lbrack;原创&rsqb;

    一.库管理 1.打开原理图,,按键盘P键 在目标库下可以直接收索需要的元件,则可直接找到 在原理图中放置器件时,结束放置快捷键:Esc 双击后,可自动将该元件对应的库添加到你的库中,该方法找元件效果好 ...

  5. TreeList 实现多表头

    1. 先上图: 2. 再上代码: 原码

  6. 01&lowbar;什么是数据结构以及C语言指针回顾

    一.数据结构是什么 如何把现实中大量而复杂的问题,以特定的数据类型和特定的数据存储结构保存到计算机的存储器中. 数据存储包括两方面:个体存储的集合.个体与个体之间的关系的存储 程序 = 算法 + 数据 ...

  7. &lowbar;&lowbar;x&lowbar;&lowbar;&lpar;31&rpar;0908第五天&lowbar;&lowbar;导航条的练习 &lt&semi;ul&gt&semi; 版本

    效果图:  html代码: <!doctype html> <html> <head> <meta charset="utf-8" /&g ...

  8. Python3&period;0科学计算学习之绘图(一)

    基本绘图: (1)  plot是标准的绘图库,调用函数plot(x,y)就可以创建一个带有绘图的图形窗口(其中y是x的函数).输入的参数为具有相同长度的数组(或列表):或者plot(y)是plot(r ...

  9. 在windows下用vagrant建立lnmp开发环境

    1.安装vagrant,vitrualbox 2.下载homestead的box包,并添加到vagrant 下载地址: https://atlas.hashicorp.com/laravel/boxe ...

  10. Javaweb学习笔记——(一)——————进入html

    1.html的简介 *什么是html? -HyperText Markup Language:超文本标记语言,网页语言 **超文本:超出文本的范畴,使用html可以轻松实现这些操作 **标记:html ...