Oracle分组排序与行转列体验

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; 


   

Guess you like

Origin blog.csdn.net/iss_jin/article/details/86551327