我已经尝试了一段时间的代码,我遇到了一个问题,我必须得到平均值高于一定数量的某些字段的数量,并按来自不同表的两个字段进行分组
以下是我的代码和期望
SELECT C.Course,S.Name, COUNT(*) as Average FROM Students S
INNER JOIN Student_Modules SM ON
SM.StudentID = S.ID
INNER JOIN Courses_Template C
ON C.ID = SM.CourseID
Group by C.Course,S.Name
Having AVG(SM.Percentage_Obtained) > 80这将返回包含课程名称、学生姓名和超过80%的百分比的行。
对我来说,这就是“通过课程的学生数量”。我想知道如何强制这个查询来给出通过课程的学生数量,而不是学生通过的模块数量,以及是否可能
编辑1:
学生布局
CREATE TABLE Students
(ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
,StudentNumber VARCHAR(20)
,Name VARCHAR(40)
,Surname VARCHAR(40)
,Student_ID VARCHAR(13)
,Languages VARCHAR(200)
,[Address] Varchar (512)
,Contact_Number varchar(20)
,Email Varchar (150)
,Days_Absent INT
,Student_Web_Username varchar(40)
,Student_Web_Password varchar(MAX)
,BranchID int
,Constraint FKStudentBranch FOREIGN KEY (BranchID) REFERENCES Branches(ID)
,CONSTRAINT Unq_StudentNumber UNIQUE (StudentNumber)
,CONSTRAINT Unq_Student_ID UNIQUE (Student_ID)); STUDENT_MODULE布局
CREATE TABLE Student_Modules
(ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
,ModuleID INT
,StudentID INT
,CourseID INT
,Percentage_Obtained INT Check (Percentage_Obtained >= -1 AND Percentage_Obtained <= 100)
,CONSTRAINT FKStudentModulesChosen FOREIGN KEY (ModuleID) REFERENCES Modules_Template(ID) ON DELETE CASCADE
,CONSTRAINT FKStudentModules FOREIGN KEY (StudentID) REFERENCES Students(ID) ON DELETE CASCADE); COURSES_TEMPLATE布局
CREATE TABLE COURSES_TEMPLATE
(ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
,Course VARCHAR(40)
,Price SMALLMONEY CHECK(Price > 0)
,BranchID INT
,CONSTRAINT FKCourseBranches FOREIGN KEY (BranchID) REFERENCES Branches(ID) ON DELETE CASCADE); 发布于 2011-10-11 06:35:42
如果它们需要在所有模块中平均通过80%。
SELECT C.Course, COUNT(*) as [Average]
FROM Students S
INNER JOIN Student_Modules SM ON S.ID = SM.StudentID
INNER JOIN Courses_Template C ON SM.CourseID = C.ID
INNER JOIN (
SELECT SM.StudentID, SM.CourseID
FROM Student_Modules SM
Group by SM.StudentID, SM.CourseID
Having AVG(SM.Percentage_Obtained) > 80
) Pass ON SM.StudentID = Pass.StudentID AND SM.CourseID = Pass.CourseID
GROUP BY C.Course 如果他们需要通过每个模块80%的分数才能通过课程,那么
SELECT C.Course, COUNT(*) as [Average]
FROM Students S
INNER JOIN Student_Modules SM ON S.ID = SM.StudentID
INNER JOIN Courses_Template C ON SM.CourseID = C.ID
LEFT OUTER JOIN (
SELECT DISTINCT SM.StudentID, SM.CourseID
FROM Student_Modules SM
WHERE SM.Percentage_Obtained <= 80
) as NotPass ON SM.StudentID = NotPass.StudentID AND SM.CourseID = NotPass.CourseID
WHERE NotPass.StudentID IS NULL
GROUP BY C.Course 这是未经测试的,让我知道任何错误或粘贴不正确的输出和预期输出。
发布于 2011-10-11 02:35:43
看起来你想知道通过每门课程的学生人数?如果是这样的话,您不是只需要按C.Course分组,然后将计数(S.Name)作为显示的NumWhoPassed吗?
https://stackoverflow.com/questions/7716919
复制相似问题