加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle行列转换

发布时间:2020-12-12 13:16:20 所属栏目:百科 来源:网络整理
导读:一、建表与插入数据 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,sco

一、建表与插入数据

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,score)
11 values (1,‘数学‘,76);
12 insert into kecheng (id,score)
13 values (1,‘英语‘,43);
14 insert into kecheng (id,score)
15 values (1,‘历史‘,56);
16 insert into kecheng (id,score)
17 values (1,‘化学‘,11);
18 insert into kecheng (id,score)
19 values (2,‘李四‘,54);
20 insert into kecheng (id,score)
21 values (2,81);
22 insert into kecheng (id,score)
23 values (2,64);
24 insert into kecheng (id,score)
25 values (2,93);
26 insert into kecheng (id,score)
27 values (2,27);
28 insert into kecheng (id,score)
29 values (3,‘王五‘,24);
30 insert into kecheng (id,score)
31 values (3,25);
32 insert into kecheng (id,score)
33 values (3,8);
34 insert into kecheng (id,score)
35 values (3,45);
36 insert into kecheng (id,score)
37 values (3,1);
38 commit;

二、固定行列转换

2.1、Decode方式

?

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

?

?

?

2.2、Case方式

?

SELECT ID,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,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 || ‘,‘‘‘ || I.COURSE ||
                   ‘‘‘,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  表

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读