zoukankan      html  css  js  c++  java
  • Oracle中纵横表的转化

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

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

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

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

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

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

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

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

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

    如何才能实现呢,这就需要用到我们上次说的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)是:


    而要求得到的是


    的话,

    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;

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


  • 相关阅读:
    [WARNING] 找不到编译器:wepy-compiler-less。 [Error] 未发现相关 less 编译器配置,请检查wepy.config.js文件。
    wepy-cli : Failed to download repo standard: getaddrinfo ENOENT raw.githubusercontent.com
    火币Huobi 币安 Binance ios 反编译
    iPhone 反编译-微信多开分身版原理,一部iPhone登录多个微信号
    安卓微信分身版 一部手机同时登录多个微信号 原理
    微信smali反编译 查看撤回消息
    微信抢红包
    Dota2 荒神罪 破解
    微信smali反编译 语音消息转发功能
    mac安装mysql流程
  • 原文地址:https://www.cnblogs.com/longjshz/p/4286821.html
Copyright © 2011-2022 走看看