我需要在表中找到分数,即所有成绩都在70到90之间的学生人数。答案应该只返回105和108,因为它们是唯一符合标准的学生人数。由于某种原因,我一直得到105108、和109,但我不明白为什么。这是下表。
分数
sno | grade
101 | 64
109 | 68
105 | 75
109 | 76
108 | 78
107 | 79
108 | 81
101 | 85
NULL | 86
105 | 88
107 | 91
103 | 92
这就是给我这个结果的查询。
SELECT sno
FROM scores
GROUP BY sno
HAVING grade BETWEEN 70 and 90;```
我想你在追求这样的东西:
SELECT sno, MIN(grade) as mingrade, MAX(grade) AS maxgrade
FROM scores
GROUP BY sno
HAVING MIN(grade) >= 70 AND MAX(grade) <= 90
但要注意,这将返回对于"0"具有空值的行;sno";因为这一行符合您的标准。如果要排除该行,则始终可以在FROM scores
之后添加WHERE sno IS NOT NULL
。
注意:很明显,如果您不希望在结果集中包含mingrade/maxgrade列,则可以省略它们。
附加说明:我认为您使用的是SQLite?大多数其他SQL方言抱怨您的示例中的语法,因为它们希望聚合函数应用于HAVING子句中使用的列。
值得一提的是,这里有一个在线演示
这个怎么样:
WITH OUTSIDE_GRADES
AS
(
SELECT SNO FROM SCORES
WHERE 1=1
AND (GRADE < 70 OR GRADE > 90)
)
SELECT distinct SNO FROM SCORES WHERE SNO NOT IN (SELECT SNO FROM
OUTSIDE_GRADES)