SQL Server-一个查询结果中的多个计数问题

SQL Server-一个查询结果中的多个计数问题,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我正在尝试使用SELECT查询来计算学生的分数。这基于3个表: 学生(学生ID主键) 等级(等级ID主键) 成绩线(成绩线ID主键、学生ID外键、成绩线ID外键) 问题是:当使用下面的查询时,如果其中一个条件为null(例如,Student3没有区别,但在所有其他列中都有一个标记),那么该Student将从查询中删除,我希望它们仍然存在,只显示一个0 SELECT GradeLine.StudentID, COUNT(CASE WHEN GradeLine.GradeID =

我正在尝试使用
SELECT
查询来计算学生的分数。这基于3个表:

  • 学生(学生ID主键)
  • 等级(等级ID主键)
  • 成绩线(成绩线ID主键、学生ID外键、成绩线ID外键)
问题是:当使用下面的查询时,如果其中一个条件为null(例如,
Student
3没有区别,但在所有其他列中都有一个标记),那么该
Student
将从查询中删除,我希望它们仍然存在,只显示一个0

SELECT
    GradeLine.StudentID,
    COUNT(CASE WHEN GradeLine.GradeID = 1 THEN (GradeLine.GradeID) END) AS Distinction,
    COUNT(CASE WHEN GradeLine.GradeID = 2 THEN (GradeLine.GradeID) END) AS  Merit,
    COUNT(CASE WHEN GradeLine.GradeID = 3 THEN (GradeLine.GradeID) END) AS Pass,
    COUNT(CASE WHEN GradeLine.GradeID = 4 THEN (GradeLine.GradeID) END) AS Fail,
    COUNT (GradeLine.GradeID) AS Total
FROM 
    GradeLine
GROUP BY 
    GradeLine.StudentID
预期数据示例:

StudentID   Distinction Merit   Pass    Fail    Total
------------------------------------------------------
   1             1         3     4       2       10
   2             1         7     2       1       11
   3             0         3     3       5       11
   4             0        12     0       0       12
   5             6         3     0       0        9
有人能告诉我我做错了什么吗

目前的新成果:

StudentID   Distinction Merit   Pass    Fail    Total
-----------------------------------------------------
   1             0        0      10      0       10
   2            11        0       0      0       11
   3             0        0       0     11       11
   4             0       12       0      0       12
   5             0        0       0      9        9
表代码、约束和示例数据:

--CREATE TABLES
CREATE TABLE Student (StudentID INT IDENTITY (1,1) NOT NULL,
Studentname VARCHAR(50))

CREATE TABLE Grade (GradeID INT IDENTITY (1,1) NOT NULL,
Gradename VARCHAR(50))

CREATE TABLE GradeLine (GradeLineID INT IDENTITY (1,1) NOT NULL,
StudentID INT,
GradeID INT)

--PK CONSTRAINTS
ALTER TABLE Student ADD CONSTRAINT StudentID_PK PRIMARY KEY (StudentID)
ALTER TABLE Grade ADD CONSTRAINT GradeID_PK PRIMARY KEY (GradeID)
ALTER TABLE GradeLine ADD CONSTRAINT GradeLine_PK PRIMARY KEY (GradeLineID)

--FK CONSTRAINTS
ALTER TABLE GradeLine ADD CONSTRAINT StudentID_GL2S FOREIGN KEY (StudentID) REFERENCES Student (StudentID)
ALTER TABLE GradeLine ADD CONSTRAINT GradeID_GL2G FOREIGN KEY (GradeID) REFERENCES Grade (GradeID)

--DATA 
INSERT INTO Student VALUES ('Student A')
INSERT INTO Student VALUES ('Student B')
INSERT INTO Student VALUES ('Student C')

INSERT INTO Grade VALUES ('Distinction')
INSERT INTO Grade VALUES ('Merit')
INSERT INTO Grade VALUES ('Pass')
INSERT INTO Grade VALUES ('Fail')

--STUDENT A 
INSERT INTO GradeLine VALUES (1, 1) --STUDENT A DISTINCTION
INSERT INTO GradeLine VALUES (1, 1) --STUDENT A DISTINCTION
INSERT INTO GradeLine VALUES (1, 2) --STUDENT A MERIT

--STUDENT B
INSERT INTO GradeLine VALUES (2, 1) --STUDENT A DISTINCTION
INSERT INTO GradeLine VALUES (2, 1) --STUDENT A DISTINCTION
INSERT INTO GradeLine VALUES (2, 2) --STUDENT A MERIT
INSERT INTO GradeLine VALUES (2, 5) --STUDENT A FAIL

--STUDENT C
INSERT INTO GradeLine VALUES (3, 2) --STUDENT A MERIT
INSERT INTO GradeLine VALUES (3, 3) --STUDENT A PASS
INSERT INTO GradeLine VALUES (3, 4) --STUDENT A FAIL

您可以使用
PIVOT

SELECT      piv.StudentID,
            piv.[1] AS Distinction,
            piv.[2] AS Merit,
            piv.[3] AS Pass,
            piv.[4] AS Fail,
            (piv.[1] + piv.[2] + piv.[3] + piv.[4]) AS Total
FROM 
(
  SELECT    StudentID, GradeID
  FROM      GradeLine
) src
PIVOT
(
  COUNT(GradeID)
  FOR GradeID IN ([1], [2], [3], [4])
) piv;
这应该在
计数为0的情况下进行

您可以在此处查看整个活动->


希望这有帮助

删除
ELSE 0
,当前它的结果与
COUNT(*)
COUNT
的结果相同,表达式对所有非空值进行计数。包括
0
。要么将
ELSE
更改为
NULL
,忽略它(因为这是默认值),要么切换到
SUM
,但在
中使用
1
,然后使用
而不是值。通过上述更改,我现在随机得到1列,显示与合计相同的值,合计值,所有其他值均为零,我已经修改了上面的问题,以反映更改和一些示例表数据及其预期结果。我已经添加了上面的预期数据和当前结果,非常有效谢谢,还有很多let代码!!