如果我们现在的需求进行了一个变化,我们需要得到的是不及格的人数和平均分,中等60-70分的人数和平均分,良好70-85的人数和平均分,85以上优秀的平均分。
这样的需要我们可以采用多条SELECT语句来分别实现各个成绩段的统计。但是SQL同样提供了直接的方法。我们看以下的写法:
Return SELECT AvgOf(["英语成绩"]),CountOf( * ),groupfunc(["英语成绩"]) from EnglishScore group by groupfunc(["英语成绩"]) end;
Function groupfunc(score);
Begin
If score<60 then return "不及格"
Else
If Score <70 then return "中等"
Else
If Score < 85 then return "良好"
Else
Return "优秀";
End;
上述代码我们可以如此理解:groupfunc只是一个自己定义的函数,用途仅仅只是为了上面的分组需要,因为英语成绩表中并没有什么是优秀什么是及格的标准。
GroupFunc把成绩分成了四档,而group by则把这四档进行分组,Avgof和countof对分组的内容进行聚集计算。如何理解呢?Avgof在没有group by的时候是对整个结果集进行处理,而有group by的时候是对分组后的每个子结果集进行运算处理。
上述代码的返回结果为:
如果我们需要的内容是返回个数>1的。那么我们的语句为:
Return SELECT AvgOf(["英语成绩"]),CountOf( * ),groupfunc(["英语成绩"]) from EnglishScore group by groupfunc(["英语成绩"]) Having CountOf( * ) >1 end;
运行结果如下:
Having和Where是不是很类似呢?许多初学SQL的人会很容易混淆两者的差异,事实上Having可以用聚集函数作为条件,而Where是不行的,Having是先group分组再计算having条件,而where则是最先开始进行条件筛选。在group by之前是允许有where条件的。