SQL Server:获取相关表列的Count(),其中包含某些条件
给定表格SQL Server:获取相关表列的Count(),其中包含某些条件,sql,sql-server,Sql,Sql Server,给定表格CollegeMajors | Id | Major | |----|-------------| | 1 | Accounting | | 2 | Math | | 3 | Engineering | 和注册学生 | Id | CollegeMajorId | Name | HasGraduated | |----|----------------|-----------------|--------------| | 1 |
CollegeMajors
| Id | Major |
|----|-------------|
| 1 | Accounting |
| 2 | Math |
| 3 | Engineering |
和注册学生
| Id | CollegeMajorId | Name | HasGraduated |
|----|----------------|-----------------|--------------|
| 1 | 1 | Grace Smith | 1 |
| 2 | 1 | Tony Fabio | 0 |
| 3 | 1 | Michael Ross | 1 |
| 4 | 3 | Fletcher Thomas | 1 |
| 5 | 2 | Dwayne Johnson | 0 |
我想做一个类似这样的查询
Select
CollegeMajors.Major,
Count(select number of students who have graduated) AS TotalGraduated,
Count(select number of students who have not graduated) AS TotalNotGraduated
From
CollegeMajors
Inner Join
EnrolledStudents On EnrolledStudents.CollegeMajorId = CollegeMajors.Id
我期待着这样的结果
| Major | TotalGraduated | TotalNotGraduated |
|-------------|----------------|-------------------|
| Accounting | 2 | 1 |
| Math | 0 | 1 |
| Engineering | 1 | 0 |
所以问题是,什么样的查询进入
COUNT
以实现上述功能 您可以在计数中使用CASE语句来获得所需的结果。请尝试下面更新的查询
Select CollegeMajors.Major
, COUNT(CASE WHEN EnrolledStudents.HasGraduated= 0 then 1 ELSE NULL END) as "TotalNotGraduated",
COUNT(CASE WHEN EnrolledStudents.HasGraduated = 1 then 1 ELSE NULL END) as "TotalGraduated"
From CollegeMajors
InnerJoin EnrolledStudents On EnrolledStudents.CollegeMajorId = CollegeMajors.Id
GROUP BY CollegeMajors.Major
您可以尝试此方法进行分级计数:
Select Count(*) From EnrolledStudents group by CollegeMajorId having HasGraduated = 1
对于非刻度的,将1更改为零:
Select Count(*) From EnrolledStudents group by CollegeMajorId having HasGraduated = 0
不,您需要group by,实际上我并没有尝试执行您的查询,我只是重新发布了您的代码,使用CASE语句计算带有条件的计数。你需要在主查询中有组,你可以只考虑计数语句作为我的答案。是的,我同意你,最初我刚刚发布了基于他的问题的计数部分,后来我只更新了整个查询而不检查他的查询的其他部分。根据你的建议,我现在用GROUPBY更新了查询。
Select CollegeMajors.Major
, COUNT(CASE WHEN EnrolledStudents.HasGraduated= 0 then 1 ELSE NULL END) as "TotalNotGraduated",
COUNT(CASE WHEN EnrolledStudents.HasGraduated = 1 then 1 ELSE NULL END) as "TotalGraduated"
From CollegeMajors
InnerJoin EnrolledStudents On EnrolledStudents.CollegeMajorId = CollegeMajors.Id
GROUP BY CollegeMajors.Major