zoukankan      html  css  js  c++  java
  • Oracle行列转换小结

    目录结构如下:
    行转列
    列转行
    [一]、行转列
    1.1、初始测试数据
    表结构:TEST_TB_GRADE
    Sql代码

    create table TEST_TB_GRADE 
    ( 
      ID        NUMBER(10) not null, 
      USER_NAME VARCHAR2(20 CHAR), 
      COURSE    VARCHAR2(20 CHAR), 
      SCORE     FLOAT 
    ) 


    初始数据如下图:


    1.2、 如果需要实现如下的查询效果图:


    这就是最常见的行转列,主要原理是利用decode函数、聚集函数(sum),结合group by分组实现的,具体的sql如下:
    Sql代码 

    select t.user_name, 
      sum(decode(t.course, '语文', score,null)) as CHINESE, 
      sum(decode(t.course, '数学', score,null)) as MATH, 
      sum(decode(t.course, '英语', score,null)) as ENGLISH 
    from test_tb_grade t 
    group by t.user_name 
    order by t.user_name 


    1.3、延伸
    如果要实现对各门功课的不同分数段进行统计,效果图如下:


    具体的实现sql如下:
    Sql代码 

    select t2.SCORE_GP, 
      sum(decode(t2.course, '语文', COUNTNUM,null)) as CHINESE, 
      sum(decode(t2.course, '数学', COUNTNUM,null)) as MATH, 
      sum(decode(t2.course, '英语', COUNTNUM,null)) as ENGLISH 
    from ( 
      select t.course, 
             case when t.score  <60 then '00-60' 
                  when t.score >=60 and t.score <80  then '60-80' 
                  when t.score >=80 then '80-100' end as SCORE_GP, 
             count(t.score) as COUNTNUM 
      FROM test_tb_grade t 
      group by t.course,  
            case when t.score  <60  then '00-60' 
                  when t.score >=60 and t.score <80  then '60-80' 
                  when t.score >=80 then '80-100' end 
      order by t.course ) t2 
    group by t2.SCORE_GP 
    order by t2.SCORE_GP 

    1.4 行转列计算条数

    初始数据如下图:

    image

    对于类型进行计算每个类型有几条数据,并且转换成列

    实现效果图为:

    image

    具体实现sql代码:

    select t.gcid, 
       count(decode(t.wxylx, 1, wxylx,null)) as lx1, 
       count(decode(t.wxylx, 2, wxylx,null)) as lx2, 
       count(decode(t.wxylx, 3, wxylx,null)) as lx3 ,
       count(decode(t.wxylx, 4, wxylx,null)) as lx4 ,
       count(decode(t.wxylx, 5, wxylx,null)) as lx5 ,
       count(decode(t.wxylx, 6, wxylx,null)) as lx6 
     from xxxx t 
     group by t.gcid 

    [二]、列转行
    1.1、初始测试数据
            表结构:TEST_TB_GRADE2
    Sql代码 

    create table TEST_TB_GRADE2 
    ( 
      ID         NUMBER(10) not null, 
      USER_NAME  VARCHAR2(20 CHAR), 
      CN_SCORE   FLOAT, 
      MATH_SCORE FLOAT, 
      EN_SCORE   FLOAT 
    ) 


            初始数据如下图:


    1.2、 如果需要实现如下的查询效果图:


    这就是最常见的列转行,主要原理是利用SQL里面的union,具体的sql语句如下:
    Sql代码 

    select user_name, '语文' COURSE , CN_SCORE as SCORE from test_tb_grade2  
    union select user_name, '数学' COURSE, MATH_SCORE as SCORE from test_tb_grade2  
    union select user_name, '英语' COURSE, EN_SCORE as SCORE from test_tb_grade2  
    order by user_name,COURSE  


    也可以利用【 insert all into ... select 】来实现,首先需要先建一个表TEST_TB_GRADE3:
    Sql代码 

    create table TEST_TB_GRADE3   
        (  
          USER_NAME VARCHAR2(20 CHAR),   
          COURSE    VARCHAR2(20 CHAR),   
          SCORE     FLOAT   
        )  

      
    再执行下面的sql:
    Sql代码 

    insert all 
    into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '语文', CN_SCORE) 
    into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '数学', MATH_SCORE) 
    into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '英语', EN_SCORE) 
    select user_name, CN_SCORE, MATH_SCORE, EN_SCORE from test_tb_grade2; 


    commit; 
    别忘记commit操作,然后再查询TEST_TB_GRADE3,发现表中的数据就是列转成行了。

    转载:http://www.2cto.com/database/201108/100792.html

  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/donghua2014/p/4140391.html
Copyright © 2011-2022 走看看