簡體   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