首页 > 数据库技术 > 详细

Oracle行列转制

时间:2015-11-13 14:29:40      阅读:346      评论:0      收藏:0      [点我收藏+]

一、建表与插入数据

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  表
技术分享


 

Oracle行列转制

原文:http://www.cnblogs.com/liunanjava/p/4961923.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!