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