我正在尝试编写一个简短的SQL查询(在MySQL Workbench中),如果一个学生因多个学生失败而输出失败次数。
这是我的尝试:
SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student)
FROM StudentTakesSubject
WHERE result < 50 AND result <> NULL
GROUP BY code
HAVING Count(Student) > 1;
问题是它一直输出包含Null记录的计数,即使我在查询中指定不计算它们(或者至少我以为我做了......)。
编辑:
这是GROUP BY
条款出错了!正如 Gordon Linoff 在他的回答中指出的那样,应该是GROUP BY SubjectCode
并且神奇地解决了这个问题。
感谢大家的建设性见解。
答案 0 :(得分:6)
正如所写:
SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student)
FROM StudentTakesSubject
WHERE result < 50 AND result <> NULL
GROUP BY code
HAVING Count(Student) > 1;
此查询不应返回任何行。为什么? result <> NULL
返回NULL
作为布尔值(近似值与NULL
的所有比较返回NULL
)。 AND NULL
评估NULL
- 而NULL
不正确。所有行都被过滤掉了。
NULL
比较实际上是多余的。 result < 50
也会过滤掉NULL
个值。
查看查询的其余部分,您还有另一个问题。 GROUP BY
位于code
。它应该在SubjectCode
上 - CONCAT()
的结果。事实上,当连接不同的列时,我建议使用分隔符,比如说CONCAT_WS(':', area, yearlevel, code)
。当然,对于这种特殊情况,分离器可能并不合适。
答案 1 :(得分:0)
result NOT NULL
代替result <> NULL
。
SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student)
FROM StudentTakesSubject
WHERE result < 50
AND result NOT NULL
GROUP BY code
HAVING Count(Student) > 1;
答案 2 :(得分:0)