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 表 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |