目录
源数据表
球队 | 进球 | 失球 | 积分 |
球队1 | 7 | 2 | 9 |
球队2 | 3 | 7 | 0 |
球队3 | 4 | 4 | 4 |
球队4 | 5 | 5 | 4 |
如图所示为某次足球比赛小组赛成绩表。根据出线规刖,该小组只能有两支球队出残。出线规则是积分靠前的两支球队出线;当积分相同时,净胜球(进球一失球)多的球队出线;当净胜球相同时,进球多的球队出线。
解决方案
SELECT TOP 2 球队 AS 出线球队
FROM [sheet1$]
ORDER BY 积分 DESC,进球-失球 DESC,进球 DESC
指定不同排序方法的多列排序
ORDER BY子句可以进行多字段的数据排序,并且可以在各字段之后加上关键字ASC或者DESC指定排序方式.
本例中,要求得到出线球队,首先取积分高的球队,然后取净胜球多的球队,最后取进球多的球队.该方式符合多字段排序中依次排序的方式,因而可以采用多字段排序按照积分、净
胜球、进球进行降序排序,再利用TOP谓词取得排序结果中的前两条记录即为出线球队。
在多字段排序中,若要指定字段的排序方式,可以加上ASC或者DESC关键字进行排序。但当关键字省略时,SQL查询默认按照ASC(升序)排序。在本例中,由于3个字段都要取
高者,因而使用降序排列后再利用TOP取前两条记录。需要注意的是,3个字段后的关键字DESC不可省略,否则SQL查询将按照默认的升序进行排序,从而无法得到所需要的结果。
利用数学计算方法进行多列排序
由于本例中所有参与排序的字段都为数字,因而除了可以利用多字段排序外,也可以将这些多个字段进行组合计算后再排序。如下列查询语句同样可以实现所需要的排序效果:
SELECT TOP 2 球队 AS 出线球队
FROM [sheet1$]
ORDER BY 积分*10000 DESC,(进球-失球)*100 DESC,进球 DESC
上述语句排序是按照积分、净胜球和进球的优先级对这些字段进行了数字的组合。积分优先级最大,因而将积分乘以10000,净胜球优先级第2,将其乘以100,然后再将三者相加。其
得到的结果为1个数字,万位以上为积分,千位和百位为净胜球,十位和个位为进球。该结果恰能表示排序的优先级。
一般情况下不建议采用该方式进行查询。因为在进行该语句查询时.SQL查询机制会计算所有记录的积分、净胜球、进球的运算结果,使得SQL运算量增加,从而降低了SQL查询速度。尤其是乘法、乘方或函数等运算,占用的系统资源将大大超过简单排序占用的系统资源,从而影响SQL的查询效率。当数据量较大时,会有比较明显的速度差异。因而,在进行单纯的捧序能够解决问题的情况下,应尽量避免使用运算符号或函数。