繁体   English   中英

SQL 服务器-根据条件从查询结果集中排除记录

[英]SQL Server - Exclude records from query result set based on condition

使用下面的查询,我试图获得每个部门的 FTE 学生平均人数,每个部门的学生总数除以该部门的 FTE 学生总数。

在少数部门中不会有 FTE 学生,为此我使用案例陈述将平均值视为 0 在这种情况下没有 FTE 学生(CASE U.[IsFTEStudent] WHEN 1 THEN 1 END)=0 THEN 0

SELECT D.[DepartmentId],
    CASE WHEN COUNT(CASE U.[IsFTEStudent] WHEN 1 THEN 1 END)=0 THEN 0
    ELSE COUNT(S.[StudentId])/COUNT(CASE U.[IsFTEStudent] WHEN 1 THEN 1 END) END AS 'AverageOfFTEStudents'
    FROM dbo.[Student] S
    INNER JOIN [dbo].User U
    ON S.[StudentId] = U.[UserId]
    INNER JOIN dbo.[Department] D
    ON D.DepartmentId = S.[DepartmentId]
    WHERE D.CollegeId = 5
    GROUP BY S.DepartmentId

上面的查询给出了平均为 0 的结果,现在我想排除那些 FTE 学生平均为 0 的部门,这意味着没有 FTE 学生。

简而言之,我的结果中应排除“AverageOfFTEStudents”为 0 的部门

我想你想要一个having子句; 您可以使用AVG()简化计算逻辑:

SELECT S.[DepartmentId],
    AVG(CASE WHEN [IsFTEStudent] = 1 THEN 1.0 ELSE 0 END) AS [AverageOfFTEStudents]
FROM dbo.[Student] S
INNER JOIN [dbo].User U ON ON S.[StudentId] = U.[UserId]
INNER JOIN dbo.[Department] D ON D.DepartmentId = S.[DepartmentId]
WHERE D.CollegeId = 5
GROUP BY S.DepartmentId
HAVING SUM(CASE WHEN [IsFTEStudent] = 1 THEN 1 ELSE 0 END) > 0

根据IsFTEStudent的实际数据类型和值,我们或许可以稍微简化聚合表达式。 例如,如果它是一个 integer 和0 / 1值,那么:

SELECT S.[DepartmentId],
    AVG([IsFTEStudent] * 1.0) AS [AverageOfFTEStudents]
FROM dbo.[Student] S
INNER JOIN [dbo].User U ON ON S.[StudentId] = U.[UserId]
INNER JOIN dbo.[Department] D ON D.DepartmentId = S.[DepartmentId]
WHERE D.CollegeId = 5
GROUP BY S.DepartmentId
HAVING SUM([IsFTEStudent]) > 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM