こんにちは、私はSQLに完全に慣れていないため、特定の期間の学生のGPAを計算するユーザー定義関数(UDF)を作成する必要があります。入力はStudentId int
、ClassStartDateStart datetime
、ClassStartDateEnd datetime
。出力は、ClassStartDateStar
tとClassStartDateEnd
の間で行われたすべてのクラスの学生のGPAです。また、この新しい関数を呼び出すスクリプトを指定して、選択したパラメーター値を渡します。コードを作成しようとしましたが、どこから始めればよいかわかりません。ここに私がこれまでに持っているものがあります:
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;
学生のための私のテーブルはこれです:
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)
私がしなければならないのは、生徒のクラスGPAを表示する集約インライン関数を作成することです。入力が認識されるように、最初にストアドプロシージャを作成する必要がありますか?
入力が認識されるように、最初にストアドプロシージャを作成する必要がありますか?
各パラメーターの先頭に@
記号がありません。
関数の作成の詳細 ここ
基本を理解したら、これ article by Jeremiah Peschkaがインライン関数などの利点を説明します。基本的に、テーブル値関数がインラインでない場合、呼び出し元のクエリによって返されるすべての行に対して1回実行されます。これは非常に非効率的です。インラインテーブル値関数は、パラメーター化されたビューと呼ばれます。
関数はスカラー関数であり、常に各行に対して1回実行されますが、以下のコードを使用してインラインテーブル値関数に変換できます。
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;
WITH SCHEMABINDING
オプションを使用すると、誰もが関数で使用されているスキーマを編集して破壊することができなくなります。