跟他学sql(第五天)

第十七问

题目:查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率(及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)
分析:说实话这道题我不会。
看来case when函数的使用还是有一些困难。
我们先来看答案吧:

SELECT score.c_id '课程号', course.c_name '课程名', MAX(score.s_score) '最高分',MIN(score.s_score) '最低分',AVG(score.s_score) '平均分',
AVG(CASE WHEN score.s_score >= 60 THEN 1.0 ELSE 0.0 END) '及格率',
AVG(CASE WHEN score.s_score >= 70 AND s_score < 80 THEN 1.0 ELSE 0.0 END) '中等率',
AVG(CASE WHEN score.s_score >= 80 AND s_score < 90 THEN 1.0 ELSE 0.0 END) '优良率',
AVG(CASE WHEN score.s_score >= 90 THEN 1.0 ELSE 0.0 END) '优秀率'
FROM score 
JOIN course
ON score.c_id = course.c_id
GROUP BY score.c_id

在这里插入图片描述

那么case when到底是怎么一回事呢?下面就让小编带大家来了解一下吧。
其实case when呢就是

case '列名' when '条件1' then '满足条件' else '不满足' end

其中如果case后面写了列名,那when后面是列名的条件:

case sex when 0 then '女' else '男' end

如果没有写,则表示行的条件,比如上面的

case when s_score >= 90 then 1.0 else 0.0 end

复习一些昨天的知识,case when还可以用来行转列(end不要忘记),主要就是在原来的行后面新增列(如果该列不存在的话),最后使用聚合函数group by

//当这一行的c_id=01时候记录他的分数,否者记录null
select s_id,
(case when c_id = '01' then s_score else null end) '01',
(case when c_id = '02' then s_score else null end) '02',
(case when c_id = '03' then s_score else null end) '03'
from score

不加group by
在这里插入图片描述

//不加max会报错
select s_id 'id',
MAX(case when c_id = '01' then s_score else null end) '01',
MAX(case when c_id = '02' then s_score else null end) '02',
MAX(case when c_id = '03' then s_score else null end) '03'
from score
GROUP BY s_id

在这里插入图片描述

第十八问

题目:按各科成绩进行排序,并显示排名。
分析:又到了学习新函数的时候了。

  • over:不能单独使用,要和分析字段rank()dense_rank()row_number()等一起使用。
//分组排名,就是按课程id分组,然后在组内排名,
//函数也很好记partition by,分割
SELECT s_id '学号',c_id '课程号',s_score '分数',
ROW_NUMBER() OVER(PARTITION BY c_id ORDER BY s_score DESC) '排名' 
FROM score 

//不加的话就是总的排名
SELECT s_id '学号',c_id '课程号',s_score '分数',
ROW_NUMBER() OVER(ORDER BY s_score DESC) '排名' 
FROM score 

第一张图是分组排序,后面一张是不分组:在这里插入图片描述

在这里插入图片描述
那么rank()dense_rank()row_number有什么区别呢?
rank()dense_rank()是不重复的排名,但是前者是1,1,3而后者是1,1,2

SELECT s_id '学号',c_id '课程号',s_score '分数',
DENSE_RANK() OVER(ORDER BY s_score DESC) '排名' 
FROM score 

SELECT s_id '学号',c_id '课程号',s_score '分数',
RANK() OVER(ORDER BY s_score DESC) '排名' 
FROM score 

在这里插入图片描述

在这里插入图片描述
如果老师比较坏,还想着按排名分4人小组,那怎么办呢?
使用ntile()函数。

SELECT s_id '学号',c_id '课程号',s_score '分数',
NTILE(4) OVER(ORDER BY s_score DESC) '小组' 
FROM score 

在这里插入图片描述


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33241802/article/details/106931387