【发布时间】:2017-04-26 08:43:19
【问题描述】:
我正在尝试使用 SELECT 查询计算学生的成绩。这基于 3 个表格:
- 学生(StudentID 主键)
- 等级(GradeID 主键)
- GradeLine(GradeLineID 主键、StudentID 外键、GradeID 外键)
问题:使用以下查询时,如果条件之一为空(例如 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
【问题讨论】:
-
删除
ELSE 0,目前与COUNT(*)的结果相同 -
COUNT使用表达式计算所有非空值。包括0。要么将ELSE更改为NULL,将其省略(因为无论如何这是默认设置)或切换到SUM,但在THEN中使用1而不是值。 -
经过上述更改,我现在随机得到 1 列,显示与总计相同,而总计,所有其他均为零,我已修改上述问题以反映更改
-
添加一些示例表数据及其预期结果。
-
我在上面添加了预期数据和我得到的当前结果
标签: sql sql-server sql-server-2012