zoukankan      html  css  js  c++  java
  • 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(2),
    name varchar(10),
    kecheng varchar(20),
    chengji varchar(3)
    );
    
    
    --插入数据:
    insert into fzq values ('1','a','语文','80');
    insert into fzq values('2','a','shuxue','70');
    insert into fzq values ('3','b','yuwen','40');
    insert into fzq values ('4','b','shuxu','100');
    insert into fzq values ('5','c','yuwen','90');
    insert into fzq values ('6','c','shuxu','92');
    
    /*首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.*/
    
    select name,sum(yuwen) yuwen,sum(shuxue) shuxue from
    (
    select name,chengji yuwen,'0' shuxue from fzq
    where kecheng='yuwen' union
    select name,'0' 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;
  • 相关阅读:
    Android JNI与多线程
    V8 API Reference Guide
    V8引擎嵌入指南
    google v8引擎常见问题
    Android单例模式
    setTimeout和setInterval
    Android ANR
    android全屏
    Android进程和线程(Android开发指南--译)
    ubuntu下一次网络流量危机
  • 原文地址:https://www.cnblogs.com/adolphyang/p/4994291.html
Copyright © 2011-2022 走看看