天天看點

oracle 使用函數,和不使用函數 行轉列 列裝行 (case when then else end) union pivot unpivot

create table grade (
     id varchar2() not null,
     name varchar2() not null,
     course varchar2() not null,
   score number() not null,
     primary key (id)
 ) 
 -- 初始化資料
 insert into grade values( '100001', '張三', '國文', );
 insert into grade values( '100002', '張三', '數學', );
 insert into grade values( '100003', '張三', '英語', );

 insert into grade values( '100004', '李四', '國文', );
 insert into grade values( '100005', '李四', '數學', );
 insert into grade values( '100006', '李四', '英語', );

 insert into grade values( '100007', '王五', '國文', );
 insert into grade values( '100008', '王五', '數學', );
 insert into grade values( '100009', '王五', '英語', );

 insert into grade values( '100010', '趙六', '國文', );
 insert into grade values( '100011', '趙六', '數學', );
 insert into grade values( '100012', '趙六', '英語', );

 insert into grade values( '100013', '李明', '國文', );
 insert into grade values( '100014', '李明', '數學', );
 insert into grade values( '100015', '李明', '英語', );
           
select * from grade         -- 學生成績表
           
oracle 使用函數,和不使用函數 行轉列 列裝行 (case when then else end) union pivot unpivot

原始 條件寫法

犯了一個小錯誤扣半天,

as 後的别名 不要加單引号,case exp when then else end 不使用逗号隔開

,很多部落格也寫錯了

一 ,列轉行 (一條列資料,轉成三條行資料:列轉行)

select name,
sum(case course when '國文' then score else  end) as 國文,
sum(case course when '數學' then score else  end) as 數學,
sum(case course when '英語' then score else  end) as 英語 
 from grade 
group by name
           
oracle 使用函數,和不使用函數 行轉列 列裝行 (case when then else end) union pivot unpivot

使用 decode 函數 列轉行

--DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
--decode(value,if,then1,else)
select name as 姓名,
sum(decode(course,'國文',score,)) as 國文,
sum(decode(course,'數學',score,))as 數學,
sum(decode(course,'英語',score,)) as 英語
from grade
group by name

           

使用pivot函數

select * from
 (select name,course,score from grade )
  pivot(sum(score) for course in('國文','數學','英語'))

![這裡寫圖檔描述](https://img-blog.csdn.net/20161114140826977)


  **--行轉列**(一條行資料,轉成三條列資料:行轉列)
           

create table sc_grade (

id varchar2(64) not null,

name varchar2(20) not null,

cn_score number(3) not null,

math_score number(3) not null,

en_score number(3) not null,

primary key (id)

)

–初始資料

insert into sc_grade values (‘10001’, ‘張三’, 75, 80, 80);

insert into sc_grade values (‘10002’,’王五’, 92, 78, 82);

insert into sc_grade values (‘10003’,’趙六’, 80, 90, 77);

insert into sc_grade values (‘10004’,’李四’, 86, 66, 81);6 insert into sc_grade values (‘10005’,’李明’, 69, 75, 80);

![這裡寫圖檔描述](https://img-blog.csdn.net/20161108111909025)

行轉列
           

select name 姓名,’國文’ as course ,cn_score as 成績 from sc_grade

union

select name 姓名,’數學’ as course ,math_score as 成績 from sc_grade

union

select name 姓名,’英語’ as course ,en_score as 成績 from sc_grade

使用unpivot函數 行轉列
           

select name,course,score from sc_grade

unpivot(score for course in (cn_score,math_score,en_score));

“`

oracle 使用函數,和不使用函數 行轉列 列裝行 (case when then else end) union pivot unpivot