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 -- 學生成績表
原始 條件寫法
犯了一個小錯誤扣半天,
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
使用 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));
“`