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

    一、建表与插入数据

    1.1、建表

    复制代码
     1 create table kecheng
     2 (
     3   id     NUMBER,
     4   name   VARCHAR2(20),
     5   course VARCHAR2(20),
     6   score  NUMBER
     7 );
     8 insert into kecheng (id, name, course, score)
     9 values (1, '张三', '语文', 67);
    10 insert into kecheng (id, name, course, score)
    11 values (1, '张三', '数学', 76);
    12 insert into kecheng (id, name, course, score)
    13 values (1, '张三', '英语', 43);
    14 insert into kecheng (id, name, course, score)
    15 values (1, '张三', '历史', 56);
    16 insert into kecheng (id, name, course, score)
    17 values (1, '张三', '化学', 11);
    18 insert into kecheng (id, name, course, score)
    19 values (2, '李四', '语文', 54);
    20 insert into kecheng (id, name, course, score)
    21 values (2, '李四', '数学', 81);
    22 insert into kecheng (id, name, course, score)
    23 values (2, '李四', '英语', 64);
    24 insert into kecheng (id, name, course, score)
    25 values (2, '李四', '历史', 93);
    26 insert into kecheng (id, name, course, score)
    27 values (2, '李四', '化学', 27);
    28 insert into kecheng (id, name, course, score)
    29 values (3, '王五', '语文', 24);
    30 insert into kecheng (id, name, course, score)
    31 values (3, '王五', '数学', 25);
    32 insert into kecheng (id, name, course, score)
    33 values (3, '王五', '英语', 8);
    34 insert into kecheng (id, name, course, score)
    35 values (3, '王五', '历史', 45);
    36 insert into kecheng (id, name, course, score)
    37 values (3, '王五', '化学', 1);
    38 commit;
    复制代码

    二、固定行列转换

    2.1、Decode方式

    复制代码
    SELECT ID,NAME,
    SUM(DECODE(course,'语文',score,0)) 语文,--这里使用max,min都可以
    SUM(DECODE(course,'数学',score,0)) 数学,
    SUM(DECODE(course,'英语',score,0)) 英语,
    SUM(DECODE(course,'历史',score,0)) 历史,
    SUM(DECODE(course,'化学',score,0)) 化学
    FROM kecheng
    GROUP BY ID ,NAME
    复制代码

    2.2、Case方式

    复制代码
    SELECT ID,NAME,
    MAX(CASE WHEN course='语文' THEN score ELSE 0 END) 语文,
    MAX(CASE WHEN course='数学' THEN score ELSE 0 END) 数学,
    MAX(CASE WHEN course='英语' THEN score ELSE 0 END) 英语,
    MAX(CASE WHEN course='历史' THEN score ELSE 0 END) 历史,
    MAX(CASE WHEN course='化学' THEN score ELSE 0 END) 化学
    FROM kecheng
    GROUP BY ID ,NAME
    复制代码

    结果与上方一样

    2.3、wmsys.wm_concat行列转换函数

    SELECT ID,NAME,
    wmsys.wm_concat(course || ':'||score) course
    FROM kecheng
    GROUP BY ID ,NAME;

    2.4、使用over(partition by t.u_id)用法

    SELECT NAME,
    wmsys.wm_concat(course ||score)  OVER (PARTITION BY NAME)
    FROM kecheng

    三、动态转换

    3.1、使用PL/SQL

    复制代码
    DECLARE
      --存放最终的SQL
      LV_SQL VARCHAR2(3000);
      --存放连接的SQL
      SQL_COMMOND VARCHAR2(3000);
      --定义游标
      CURSOR CUR IS
        SELECT COURSE FROM KECHENG GROUP BY COURSE;
    BEGIN
      --定义查询开头
      SQL_COMMOND := 'SELECT NAME ';
    
      FOR I IN CUR LOOP
        --将结果相连接
        SQL_COMMOND := SQL_COMMOND || ' ,SUM(DECODE(course,''' || I.COURSE ||
                       ''',score,0)) ' || I.COURSE;
        DBMS_OUTPUT.PUT_LINE(SQL_COMMOND);
      END LOOP;
      SQL_COMMOND := SQL_COMMOND || ' from KECHENG group by name';
      LV_SQL      := 'INSERT INTO temp_ss  ' || SQL_COMMOND;
      DBMS_OUTPUT.PUT_LINE(LV_SQL);
      EXECUTE IMMEDIATE LV_SQL;
    END;
    复制代码
    temp_ss  表

  • 相关阅读:
    linux JAVA JDK环境配置
    逍遥语录
    php常用函数集
    使用uGUI系统玩转标准俄罗斯方块
    Unity3D中uGUI事件系统简述及使用方法总结
    JAVA笔记-如何将百万级数据高效的导出到Excel表单
    简单的异步Socket实现——SimpleSocket_V1.1
    Netty4.x中文教程系列(六) 从头开始Bootstrap
    Unity3D中简单的C#异步Socket实现
    基于Spring框架的简单多数据源切换解决办法
  • 原文地址:https://www.cnblogs.com/Soprano/p/10659122.html
Copyright © 2011-2022 走看看