SQLServer 標量值函數定義 和 使用實例


--自定義函數
--名次查詢
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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM