本文的读者群:如果你在对于结果集的排列顺序有着特殊需求,不仅单纯的需要按照某些列顺序或逆序,而又无从下手的话,那么这篇文章绝对的适合你!
让我们开始:首先我要建立一个场景以便于你理解。某学校进行了一次数学考试,将学生的成绩存入数据库中。
建立分数表,并模拟10个学生的考试成绩数据:
- –建立成绩表
- create table GradeList
- (
- ID int identity(1,1) not null primary key, –ID列
- Name nvarchar(20) null, –姓名
- Grade int not null default(0) –分数
- )
- –模拟测试数据:10个学生的成绩
- insert into GradeList (Name,Grade)
- select ’王欣’,78 union all
- select ’李磊’,85 union all
- select ’赵晓芳’,66 union all
- select ’周刚’,94 union all
- select ’孙菲菲’,82 union all
- select ’王强’,100 union all
- select ’张剑’,77 union all
- select ’吴飞’,90 union all
- select ’刘霞’,71 union all
- select ’方明’,54
-
- select * from GradeList
结果集如下:
一、一般情况下,我们需要出一个成绩单,那么对学生的成绩进行倒叙排列即可
- –成绩单(按照成绩倒叙排列)
- select Name,Grade from GradeList order by Grade desc
结果集如下:
二、然后有个特定的教务需求,要将成绩为90分的学生放在第一位,出一个成绩单(很可能现实中没有这种需求)。
- –将分数为90分的学生放在第一位
- select Name,Grade from GradeList order by case when Grade=90 then 1 else 2 end asc
结果集如下:
这里我应用了传说中的“定值排序”,是在order by语句后面使用case条件句实现的。在case中,校验Grade的值,当=90时,返回1;而其他值时,返回else中的2。最后,按照这个case条件句的返回值,升序(asc)排列,即1排在2之前。这样,当Grade=90的条目就会排在第一位了。
三、接下来,进行一下复杂一些的应用:学校需要列出一个最需要教师关注的学生名单。最先关注不及格的学生(<60),辅导他们提高成绩;其次是优等生(>90),让他们保持成绩稳定;再次是刚刚及格的学生(>=60,<=70),加强他们学习的积极性;然后是成绩较好的学生(>=80,<=90),鼓励他们冲进第一线
- –按照特定的要求排序,在同一组排序中,按照成绩的降序排列
- select Name,Grade from GradeList
- order by
- case when Grade<60 then 1
- else case when Grade>90 then 2
- else case when Grade between 60 and 70 then 3
- else case when Grade between 80 and 90 then 4
- else 5
- end end end end,Grade desc
结果集如下:
文章里面只是举了一个简单的例子,对于千变万化的数据库系统来说,很少会有这种简单的排序应用,但是万变不离其宗。只要掌握好order by后面的case语句使用就可以以不变应万变。