Tsql 是否可以在聚合中使用聚合来获得特定的单个值?
我一直在玩代码有一段时间了,我遇到了一个问题,我必须得到某些字段的数量,这些字段的平均值高于某个数量,由不同表中的两个字段分组 这是我的代码和期望Tsql 是否可以在聚合中使用聚合来获得特定的单个值?,tsql,Tsql,我一直在玩代码有一段时间了,我遇到了一个问题,我必须得到某些字段的数量,这些字段的平均值高于某个数量,由不同表中的两个字段分组 这是我的代码和期望 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.
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:
学生布局
学生单元布局
看起来你想知道通过每门课程的学生人数?如果不是这样的话,您只需要按C.课程分组,然后将CountS.Name设置为NumWhoPassed以显示?如果他们需要在所有模块中平均通过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
这是未测试的,请告诉我任何错误或粘贴不正确的输出和预期的输出 你也能展示一下你的桌子结构吗?从你的查询中推断出来不是件容易的事。我会尽我所能粘贴它。相当大的布局,但我们只需要与查询相关的字段。我只看到列出了3个表和5或6个字段。CountCourse,Student,CountAVGSM.Percentage_获得>80因此,如果删除S.Name,它会给出课程通过模块的总数,而不是通过模块的学生数?我一定是生锈了,因为我想事情不是这样的。我一时想不出别的办法:对不起,没关系。别担心。我设法让它显示每个模块,但它仍然不是我所需要的工作对我来说足够好,虽然我做了一个学生课程表的整体重新设计,包含一个位字段标记为真时,所有相关模块与该表根据学生是80%以上。干得好
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);
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
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