zoukankan      html  css  js  c++  java
  • 【转】Oracle行列互换

    原文:http://xace.javaeye.com/blog/434537

    /*  

    在实际使用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没有测试,请根据实际情况修改  
     
    如果有更好的方法,欢迎交流.  
    */ 
  • 相关阅读:
    结对编程作业
    软件工程网络15个人阅读作业1
    Java课程设计——学生基本信息管理
    JAVA课程设计
    201521123102 《Java程序设计》第12周学习总结
    201521123102 《Java程序设计》第11周学习总结
    201521123102 《Java程序设计》第9周学习总结
    个人作业5——软工个人总结
    alpha阶段个人总结
    案例分析
  • 原文地址:https://www.cnblogs.com/ungshow/p/1605469.html
Copyright © 2011-2022 走看看