专栏首页SQL实现SQL 打印成绩单

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 。成绩单需要满足以下几个要求:

  1. 绩点低于 8 的学生不显示名字,使用 NULL 代替。
  2. 成绩单都得先按照绩点降序排序,对于绩点相同的记录,如果绩点 >= 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 ,就再按照分数升序排序”中的“升序排序”改成“降序排序”,你会怎么做?

本文分享自微信公众号 - SQL实现(gh_684ee9235a26),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL 动态排序

    有时候,我们希望依据某些条件逻辑来排序。比如,对于员工表 emp,我们希望按照薪资(sal )从低到高排序。有一个要求,处于管理岗位的职工排在普通员工的后面,即...

    白日梦想家
  • SQL 将多列的数据转到一列

    如题。假设我们要把 emp 表中的 ename、job 和 sal 字段的值整合到一列中,每个员工的数据(按照 ename -> job -> sal 的顺序展...

    白日梦想家
  • 模拟 GROUP_CONCAT() 函数

    MySQL 提供了 GROUP_CONCAT() 函数,可以很方便地针对某字段下的值聚合成一个字符串,字符串内部默认使用“,”分割。

    白日梦想家
  • 特朗普关税大棒今日落下!谷歌Nest、半导体产业或首当其冲!

    【新智元导读】当地时间周五上午0点01分,美国将对价值340亿美元中国商品加征25%的关税,另外还有160亿美元的商品预计将在两周后加税。中国将在美方的加征关税...

    新智元
  • 十年程序员老兵告诉你,2018年程序员如何发展

    本文根据作者亲身经验、体会和思考,为工作年限在10年之内的程序员,尤其是职场新人,提供了一些建议。

    技术zhai
  • 十年程序员老兵告诉你,2018年程序员如何发展

    本文根据作者亲身经验、体会和思考,为工作年限在10年之内的程序员,尤其是职场新人,提供了一些建议。

    技术zhai
  • 通用计数器的测试特性

    本文以通用计数器的功能特性为基础,对目前适用于市场的通用计数器在功能应用上的可行性做了分析,即以通用计数器的功能了解通用计数器的测试特性,方便用户对通用计数器的...

    时频专家
  • 通用计数器的测试特性

    本文以通用计数器的功能特性为基础,对目前适用于市场的通用计数器在功能应用上的可行性做了分析,即以通用计数器的功能了解通用计数器的测试特性,方便用户对通用计数器的...

    时频专家
  • 实验5.1 存储过程的建立与使用

    使用CREATE  PROCEDURE语句创建存储过程,ALTER  PROCEDURE语句修改存储过程,DROP  PROCEDURE语句删除存储过程,存储过...

    week
  • JavaScript之对象拷贝与赋值

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄

扫码关注云+社区

领取腾讯云代金券