在sql

时间:2016-06-03 15:58:15

标签: sql sql-server having

我正在使用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),不是吗? 并且它没有表明该主题有大多数学生第一次失败。提前谢谢,抱歉我的英文不好

2 个答案:

答案 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)

听起来你正在为一个班级的项目工作,所以我甚至不确定我应该回答这个问题,但是这里有。问题是为什么有条款。您是否已阅读havingall的说明?

全部&#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是我们的朋友!