SQL 打印成绩单
这是 HackerRank 上的一道中级难度的 SQL 挑战题,实际上考察的是动态排序。
问题描述
有两个表:Students 和 Grades,Students 记录了学生的分数,Grades 存储了分数和绩点的对应关系。Students 包含了三个字段:ID、Name(姓名)、Marks(分数)。
Column |
Type |
---|---|
ID |
Integer |
Name |
String |
Marks |
Integer |
Grades 有三个字段:Grade(绩点)、Min_Mark(最小分值)、Max_Mark(最大分值)。它的数据如下:
Grade |
Min_Mark |
Max_Mark |
---|---|---|
1 |
0 |
9 |
2 |
10 |
19 |
3 |
20 |
29 |
4 |
30 |
39 |
5 |
40 |
49 |
6 |
50 |
59 |
7 |
60 |
69 |
8 |
70 |
79 |
9 |
80 |
89 |
10 |
90 |
100 |
根据这两张表,生成一份学习成绩单,这份成绩单要包含这三个字段:Name、Grade、Mark 。成绩单需要满足以下几个要求:
- 绩点低于 8 的学生不显示名字,使用
NULL
代替。 - 成绩单都得先按照绩点降序排序,对于绩点相同的记录,如果绩点 >= 8,就再按照姓名的字母顺序排序;如果绩点 < 8 ,就再按照分数升序排序。
输入样例
ID |
Name |
Marks |
---|---|---|
1 |
Julia |
88 |
2 |
Samantha |
68 |
3 |
Maria |
99 |
4 |
Scarlet |
78 |
5 |
Ashley |
63 |
6 |
Jane |
81 |
输出结果
Maria 10 99
Jane 9 81
Julia 9 88
Scarlet 8 78
NULL 7 63
NULL 7 68
解决方案
先把 Students 的 Marks 翻译成 Grade,这个通过 Students 和 Grades 关联查询就能做到。
SELECT
name,
grade,
marks
FROM
Students
INNER JOIN Grades
ON marks BETWEEN min_mark
AND max_mark
接着就是排序和格式化的操作。排序涉及到三个字段,首先依据 grade 做降序排序;其次,根据 grade 的范围选择 name 或者 marks 做升序排序。因此,ORDER
子句可以这么写:ORDER BY grade DESC,IF(grade >= 8, name, marks)
。
完整的 SQL (MySQL)实现:
SELECT
IF(grade >= 8, name, NULL) AS name,
grade,
marks
FROM
Students
INNER JOIN Grades
ON marks BETWEEN min_mark
AND max_mark
ORDER BY grade DESC,
IF(grade >= 8, name, marks)
留一个思考题,如果把排序的条件“如果绩点 < 8 ,就再按照分数升序排序”中的“升序排序”改成“降序排序”,你会怎么做?
- 翻译:如何使用CSS实现多行文本的省略号显示
- node中子进程同步输出
- Java开源博客My-Blog之docker容器组件化修改
- 几个行列转换的实用小例子(r4笔记第2天)
- History API与浏览器历史堆栈管理
- node中创建服务进程
- 数据挖掘工程师:如何通过百度地图API抓取建筑物周边位置、房价信息
- crontab导致CPU异常的问题分析及处理(r3笔记第100天)
- 短信接口被恶意调用(二)肉搏战-阻止恶意请求
- 关于首屏时间采集自动化的解决方案
- javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites
- 一次数据库无法登陆的问题及排查 (r3笔记第99天)
- 用深度学习keras的cnn做图像识别分类,准确率达97%
- 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解