Oracle行列轉換

2021-08-28 17:25:32 字數 3858 閱讀 4634

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);

二、固定行列轉換

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)) 化學

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行列轉換函式

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

三、動態轉換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行列轉換

1.列轉行 create table t col row id int,c1 varchar2 10 c2 varchar2 10 c3 varchar2 10 insert into t col row values 1,v11 v21 v31 insert into t col row valu...

Oracle行列轉換

行轉列 select count over cnt,rn,str from select rownum rn,substr a.str,instr a.str,1,a.n 1,instr a.str,1,a.n 1 instr a.str,1,a.n 1 str from select a,b,c,...

oracle 行列轉換

q 如何實現行列轉換 a 1 固定列數的行列轉換 如student subject grade student1 語文 80 student1 數學 70 student1 英語 60 student2 語文 90 student2 數學 80 student2 英語 100 轉換為 語文 數學 英...