在sql server2005中可以在聚合函数的后面使用over(partition by col)替换group by的写法。有时候这样写比group by的形式要简短一些。下面我用AVG为例说明一下:
下面的sql创建了一张student_class_grade的表,该表的三个字段分别为学生id,班级编号,成绩;我们需要查询系统中的所有同学的成绩,和班级的平均成绩。
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字if object_id('student_class_grade','U'is not null
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
drop table student_class_grade;
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
GO
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
create table student_class_grade
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字(
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字    student_id 
int--学生id
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
    class_no int--班级编号
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
    grade int --成绩
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
GO
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(1,1,90);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(2,1,85);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(3,1,80);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(4,1,80);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(5,1,90);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(6,1,75);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(7,1,89);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(11,2,90);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(12,2,85);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(13,2,80);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(14,2,80);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(15,2,90);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(16,2,75);
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INSERT INTO student_class_grade VALUES(17,2,100);
sql server2005中我们可以用简单的一个语句完成这个任务partition by 后面跟聚合列,如下:
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字select    
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字    student_id,class_no,grade
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字    ,class_avg_grade 
= AVG(grade) over(partition by class_no) 
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
from student_class_grade
若是在2000中,我们不得不使用子查询,查询要复杂一些
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字select scg.student_id
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字    ,scg.class_no
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字    ,scg.grade
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字    ,t_avg. class_avg_grade 
from student_class_grade scg
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
INNER JOIN 
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字(
select class_no,class_avg_grade = AVG(grade) from student_class_grade group by class_no) t_avg
sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
ON t_avg.class_no = scg.class_no
同样其他聚合函数SUM,COUNT,MAX,MIN也可以使用类似用法。

相关文章:

  • 2022-02-01
  • 2021-09-30
  • 2021-11-19
  • 2021-10-17
  • 2022-01-06
  • 2021-10-27
  • 2021-08-27
猜你喜欢
  • 2022-01-07
  • 2021-09-28
  • 2021-06-20
  • 2022-01-08
  • 2022-01-19
相关资源
相似解决方案