1. 分组排序
1.1 创建学生表
//创建表
create tsble tb_student (
stu_id number PRIMARY KEY,
stu_no varchar2 (20),
stu_name varchar2 (50),
stu_phone varchar2 (20),
entr_date date
);
//初始化备注
comment on column tb_student.stu_id is '学生物理主键';
comment on column tb_student.stu_no is '学号';
comment on column tb_student.stu_name is '学生姓名';
comment on column tb_student.stu_phone is '电话号码';
comment on column tb_student.entr_date is '入学时间';
//初始化数据
insert into tb_student values(1,'201240630150','上','18326899342',sysdate);
insert into tb_student values(2,'201240630120','维','18326899339',sysdate);
insert into tb_student values(3,'201240630130','丹','18326899340',sysdate);
insert into tb_student values(4,'201240630140','其','18326899341',sysdate);
1.2 创建学生成绩表
//创建表
create table tb_mark(
mark_id number primary key,
stu_no varchar2(20),
stu_course varchar2(50),
stu_score number,
stu_grade varchar2(20)
);
//初始化备注
comment on column tb_mark.mark_id is '成绩物理主键';
comment on column tb_mark.stu_no is '学号';
comment on column tb_mark.stu_course is '课程';
comment on column tb_mark.stu_score is '分数';
comment on column tb_mark.stu_grade is '年级';
//初始化数据
insert into tb_mark values(1,'201240630150','数学',80,'2012');
insert into tb_mark values(2,'201240630150','语文',70,'2012');
insert into tb_mark values(3,'201240630150','英语',60,'2012');
insert into tb_mark values(4,'201240630120','数学',100,'2012');
insert into tb_mark values(5,'201240630120','语文',90,'2012');
insert into tb_mark values(6,'201240630120','英语',110,'2012');
insert into tb_mark values(7,'201240630130','数学',70,'2012');
insert into tb_mark values(8,'201240630130','语文',90,'2012');
insert into tb_mark values(9,'201240630130','英语',120,'2012');
insert into tb_mark values(10,'201240630140','数学',100,'2012');
insert into tb_mark values(11,'201240630140','语文',80,'2012');
insert into tb_mark values(12,'201240630140','英语',90,'2012');
1.3 排序查询例子
问题: 查询每个学生的最高科目的成绩,要求按 学号,姓名,课程,分数 展示
//两表关联查询,获取【reslt_a】
select stu.stu_no,
stu.stu_name,
mak.stu_course,
mak.stu_score
from
tb_student stu,
tb_mark mak
WHERE stu.stu_no = mak.stu_no;
// 函数语法:[ ROW_NUMBER()| RANK() | DENSE_RANK ] OVER (partition by xx order by xx)
select
row_number () over (PARTITION BY tb_one.stu_no ORDER BY tb_one.stu_scor DESC) rn,
tb_one.* from
(【reslt_a】) tb_one;
2.行转列
2.1 使用 decode 函数实现
select ms.stu_no 学号,
ms.stu_name 姓名,
sum(decode(ms.stu_course, '语文', ms.stu_score)) 语文,
sum(decode(ms.stu_course, '数学', ms.stu_score)) 数学,
sum(decode(ms.stu_course, '英语', ms.stu_score)) 英语
from (select s.stu_no, s.stu_name, m.stu_course, m.stu_score
from tb_student s, tb_mark m where s.stu_no = m.stu_no) ms
group by ms.stu_no, ms.stu_name;
2.2 使用 case when.. then 实现
select ms.stu_no 学号,
ms.stu_name 姓名,
SUM( CASE WHEN ms.stu_course = '语文' THEN ms.stu_score ELSE 0 END ) 语文,
SUM( CASE WHEN ms.stu_course = '数学' THEN ms.stu_score ELSE 0 END ) 数学,
SUM( CASE WHEN ms.stu_course = '英语' THEN ms.stu_score ELSE 0 END ) 英语
from (select s.stu_no, s.stu_name, m.stu_course, m.stu_score
from tb_student s, tb_mark m where s.stu_no = m.stu_no) ms
group by ms.stu_no, ms.stu_name;