一、建表与插入数据
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 表