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