第一:行转列
测试数据如下:
-- 学生成绩表
create table grade (
id varchar2(64) not null,
name varchar2(20) not null,
course varchar2(100) not null,
score number(3) not null,
primary key (id)
);
-- 初始化数据
insert into grade values( '100001', '张三', '语文', 75);
insert into grade values( '100002', '张三', '数学', 80);
insert into grade values( '100003', '张三', '英语', 80);
insert into grade values( '100004', '李四', '语文', 86);
insert into grade values( '100005', '李四', '数学', 66);
insert into grade values( '100006', '李四', '英语', 81);
insert into grade values( '100007', '王五', '语文', 92);
insert into grade values( '100008', '王五', '数学', 78);
insert into grade values( '100009', '王五', '英语', 82);
insert into grade values( '100010', '赵六', '语文', 80);
insert into grade values( '100011', '赵六', '数学', 90);
insert into grade values( '100012', '赵六', '英语', 77);
insert into grade values( '100013', '李明', '语文', 69);
insert into grade values( '100014', '李明', '数学', 75);
insert into grade values( '100015', '李明', '英语', 80);
commit;
初始数据展示:

第一种写法:
select t.name,
sum(decode(t.course, '语文', t.score, 0)) 语文,
sum(decode(t.course, '数学', t.score, 0)) 数学,
sum(decode(t.course, '英语', t.score, 0)) 英语
from grade t
group by t.name;
第二种写法:
基本语法:
SELECT * FROM
(
SELECT 列1, 列2, 列3
FROM 表名
)
PIVOT
(
聚合函数(列3)
FOR 列2 IN (值1 AS 别名1, 值2 AS 别名2, ...)
);
select *
from (select name, course, score from grade)
pivot(sum(score)
for course in('语文' as 语文, '数学' as 数学, '英语' as 英语));
结果展示:

第二:列转行
测试数据如下:
--列转行
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);
insert into sc_grade values ('10005','李明', 69, 75, 80);
commit;
初始数据展示

第一种写法:
select name "姓名", '语文' course, cn_score as score
from sc_grade
union
select name "姓名", '数学' course, math_score as score
from sc_grade
union
select name "姓名", '英语' course, en_score as score
from sc_grade
order by "姓名", course;
第二种写法:
基础语法:
SELECT * FROM 表名
UNPIVOT
(
新值列名
FOR 新列名列名 IN (列1 AS '值1', 列2 AS '值2', ...)
);
新增两个新列
select name, course, score from sc_grade
unpivot
(
score
for course in(cn_score as '语文', math_score as '数学', en_score as '英语')
);
结果展示:


1217

被折叠的 条评论
为什么被折叠?



