Zec*_*iah 5 sql-server t-sql functions
我对 SQL 完全陌生,我必须编写一个用户定义的函数 (UDF) 来计算给定时间范围内学生的 GPA。这些输入StudentId int
,ClassStartDateStart datetime
以及ClassStartDateEnd datetime
。其中输出应该是学生在ClassStartDateStar
t 和之间参加的所有课程的 GPA ClassStartDateEnd
。此外,提供调用此新函数的脚本,将您选择的参数值传递给它。我尝试创建一个代码,但不知道从哪里开始。这是我到目前为止所拥有的:
USE [Master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION GPAofStudents
(StudentID int,
ClassStartDateStart datetime,
ClassStartDateEnd datetime)
RETURNS decimal(3,2)
AS
BEGIN
DECLARE AvgGPA decimal(5,2);
SET AvgGPA = (SELECT AVG(Class_GPA)
FROM Students_Classes
WHERE Student_ID = StudentID
AND Start_Date > ClassStartDateStart
AND Start_Date <= ClassStartDateEnd
AND Class_GPA > 0;
RETURN AvgGPA;
END;
Run Code Online (Sandbox Code Playgroud)
我给学生的桌子是这样的:
CREATE TABLE [dbo].[Students_Classes](
[Student_Class_ID] [int] IDENTITY(1,1) NOT NULL,
[Student_ID] [int] NOT NULL,
[Class_ID] [int] NOT NULL,
[Start_Date] [date] NOT NULL,
[Assignment1] [int] NULL,
[Assignment2] [int] NULL,
[Assignment3] [int] NULL,
[Assignment4] [int] NULL,
[Class_GPA] [int] NULL,
CONSTRAINT [Student_Class_ID] PRIMARY KEY CLUSTERED
(
USE [A_University_Database]
INSERT INTO Students_Classes
([Student_ID],[Class_ID],[Start_Date],[Assignment1],[Assignment2],[Assignment3],
[Assignment4],[Class_GPA])
VALUES
('1', '5', '2010-05-30', '86', '92', '69', '99', NULL),
('1', '6', '2010-05-30', '86', '92', '69', '99', NULL),
('2', '2', '2010-05-30', '99', '85', '91', '79', NULL),
('2', '7', '2010-05-30', '99', '85', '91', '79', NULL),
('3', '3', '2010-10-01', '67', '91', '71', '100', NULL),
('3', '4', '2010-10-01', '67', '91', '71', '100', NULL),
('4', '5', '2009-02-21', '56', '93', '72', '86', NULL),
('4', '6', '2009-02-21', '56', '93', '72', '86', NULL)
Run Code Online (Sandbox Code Playgroud)
我要做的是创建一个聚合内联函数,显示学生班级 GPA。我是否需要先创建一个存储过程才能识别输入?
我是否需要先创建一个存储过程才能识别输入?
您@
在每个参数的开头都缺少符号。
在此处了解有关编写函数的更多信息
一旦您了解了基础知识,Jeremiah Peschka 撰写的这篇文章将解释内联函数的好处等等。基本上,如果您的表值函数不是内联的,那么它将为调用查询返回的每一行执行一次。这可能非常低效。内联表值函数可以称为参数化视图。
您的函数是一个标量函数,它总是对每一行执行一次,但可以使用以下代码将其转换为内联表值函数。
CREATE FUNCTION dbo.GPAofStudents
(@StudentID int,
@ClassStartDateStart date,
@ClassStartDateEnd date)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
SELECT @StudentID AS Student_ID,
AVG(Class_GPA) AS GPA
FROM dbo.Students_Classes
WHERE Student_ID = @StudentID
AND Start_Date > @ClassStartDateStart
AND Start_Date <= @ClassStartDateEnd
AND Class_GPA > 0;
Run Code Online (Sandbox Code Playgroud)
使用该WITH SCHEMABINDING
选项将阻止任何人编辑您的函数使用的架构并破坏它。
归档时间: |
|
查看次数: |
4387 次 |
最近记录: |