我正在使用sql server management studio 2012,并且必须在此表中进行查询,以显示学生首次失败的主题(失败的条件是点<5.0)
StudentID | SubjectID | First/Second_Time | Point.
1 | 02 | 1 | 5.0
2 | 04 | 2 | 7.0
3 | 03 | 2 | 9
... etc
以下是我老师的问题:
SELECT SubjectID
FROM Result(NAME OF the TABLE)
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point) >= ALL
(
SELECT count(point)
FROM Result
WHERE [First/Second_Time] = 1 AND point < 5
GROUP BY SubjectID
)
我不理解进行查询的原因。因为Count(point)
总是>=all(select count(point)
from Result
where First/Second_Time=1 and point<5
group by SubjectID)
,不是吗?
并且它没有表明该主题有大多数学生第一次失败。提前谢谢,抱歉我的英文不好
答案 0 :(得分:1)
子查询返回主题失败次数的列表(第一次尝试时)。如果您按照以下方式运行它,可能更容易看到它正在做什么:
SELECT SubjectID, count(point)
FROM Result
WHERE [First/Second_Time] = 1 AND point < 5
GROUP BY SubjectID
因此,如果有人两次数学失败并且科学失败一次,则子查询将返回:
2
1
您想知道哪个主题失败最多(在这种情况下,哪个主题失败了2次或更多次,因为这是您的子查询中失败次数最多)。因此,您再次计算(还按主题分组),并使用having
仅返回具有2个或更多失败(大于或等于子查询中的最高值)的主题。
SELECT SubjectID
FROM Result
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point)...
有关更多示例,请参阅https://msdn.microsoft.com/en-us/library/ms178543.aspx。
答案 1 :(得分:1)
听起来你正在为一个班级的项目工作,所以我甚至不确定我应该回答这个问题,但是这里有。问题是为什么有条款。您是否已阅读having和all的说明?
全部&#34;将标量值与单列值集进行比较&#34;。 在这种情况下,标量值是count(点)或点数小于5的主题id的出现次数。在这种情况下,单列集是每个主题小于5的出现次数列表分。
比较的最终结果是&#34;&gt; =&#34;。 &#34;所有&#34;如果子查询中的每个值都为true,则只会求值为true。子查询返回满足&lt; 5和第一次要求的所有主题的一组计数。如果你有三个科目符合&lt; 5和第一时间标准,并且他们的频率分别为1,2,3次,那么主查询将有三个&#34;有&#34;结果; 1,2,3。每个主要查询结果必须> = =该主要值的每个子查询结果才能评估为真。因此,逐步进行,第一主要值1是> = 1,但是不是&lt; t&gt; = 2因此,因为&#34;具有&#34;是假的。第二主值2是> = 1,是> = 2,但不是> = 3因此它下降。第三个值3评估为&gt; = 1,2和3,因此您最终返回频率最高的主题。
这在&#34;备注&#34;中相当清楚。 MSDN讨论的一部分&#34; All&#34;关键字,但与您的特定应用无关。
请记住,MSDN是我们的朋友!