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外键)
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代码!!