--自定義函數 --名次查詢 USE [yuejuan105] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --獲取考試成績名次。 CREATE FUNCTION [dbo].[GetRankNum] ( @ExamID varchar(30) , --考試批次 @GradeID varchar(30), --年級ID @ClassID varchar(30), --班級ID @SubjectID varchar(30), --科目ID @TestScores varchar(30), --考試分數 @Type int --查詢類型(1:科目班級名次、2:科目年級名次、3:總分班級名次、4:總分年級名次) ) RETURNS integer AS begin declare @intVac int --返回名次 --科目班級名次 if(@Type=1) begin Select @intVac = Count(1) FROM T_CJ Where 1=1 AND BJ=@ClassID AND NJ=@GradeID AND KSID = @ExamID AND KM = @SubjectID AND ZF > @TestScores end --科目年級名次 else if(@Type=2) begin Select @intVac = Count(1) FROM T_CJ Where 1=1 AND NJ=@GradeID AND KSID = @ExamID AND KM = @SubjectID AND ZF > @TestScores end --總分班級名次 else if(@Type=3) begin Select @intVac = Count(1) FROM T_CJ Where 1=1 AND BJ=@ClassID AND NJ=@GradeID AND KSID = @ExamID AND ZF > @TestScores end --總分年級名次 else if(@Type=4) begin Select @intVac = Count(1) FROM T_CJ Where 1=1 AND NJ=@GradeID AND KSID = @ExamID AND ZF > @TestScores end else begin Select @intVac =-1 end --返回名次 return @intVac+1 end GO --調用標量值函數-班年科目查詢 Select A.CJID , A.XH, A.XSXM, A.NJ, A.BJ, A.KM, ZF, B.ClassAVG, C.GradeAVG, dbo.GetRankNum(A.KSID,A.NJ,A.BJ,A.KM,A.ZF,1) AS ClassNum, dbo.GetRankNum(A.KSID,A.NJ,A.BJ,A.KM,A.ZF,2) AS GradeNum FROM dbo.T_CJ AS A Left join ( Select KM,KSID,BJ,NJ,avg(ZF) as ClassAVG FROM T_CJ Group by KM,KSID,BJ,NJ ) AS B ON A.km=b.km and a.nj=b.nj and a.bj=b.bj and a.ksid=b.ksid Left Join ( Select KM,KSID,NJ,avg(ZF) as GradeAVG FROM T_CJ Group by KM,KSID,NJ ) AS C ON A.km=C.km and a.nj=C.nj and a.ksid=C.ksid Where 1=1