首先,尽管这个SQL: How do you select only groups that do not contain a certain value?主题几乎与我的问题相同,但它并没有完全消除我对这个问题的困惑。
我们有一张桌子"联系人"喜欢这个:
+----------------------+
| Department FirstName |
+----------------------+
| 100 Thomas |
| 200 Peter |
| 100 Jerry |
+----------------------+
首先,我想按部门编号对行进行分组,并显示每个显示组中的行数。我相信,这可以通过以下查询轻松完成。
SELECT Department, Count(*) As "Rows_in_group"
FROM Contacts
GROUP BY Department
这输出2组。首先是dep.no. 100包含2行,第二行200只包含一行。
但是,我想扩展查询以排除任何在某些列中不包含特定值的组(例如,FirstName中的Thomas)。以下是我的问题:
1)阅读上面提到的帖子我能够想出这个,这似乎工作正常:
SELECT Department, Count(*) As "Rows_in_group"
FROM Contacts
WHERE Department IN (SELECT Department FROM Contacts WHERE FirstName = "Thomas")
GROUP BY Department
问:这是如何运作的?我理解" WHERE部门IN"部分,但后来我期待一个值,但是包含了另一个嵌套查询,这对我来说并没有多大意义,因为我只是初学SQL。
2)偶然的我能够提出另一个似乎也有效的查询,但感觉很奇怪,而且我也不了解它的工作原理。
SELECT Department, Count(*) As "Rows_in_group"
FROM Contacts
GROUP BY Department
HAVING NOT SUM(FirstName = "Thomas") = 0
问:这是如何运作的?为什么改变:HAVING SUM(FirstName =" Thomas")> 0不起作用?
3)问:使用HAVING子句是否有任何简单而正确的方法?
我期待,那么简单" HAVING FirstName =' Thomas'"在GROUP BY之后会做出伎俩,因为它似乎遵循一种共同的语言,但事实并非如此。
请注意我希望查询选择整个群组,以便" WHERE FirstName =' Thomas'"不是我的问题的解决方案,因为它排除了在分组发生之前不满足条件的所有行(至少我理解它的方式)。
答案 0 :(得分:0)
问:这是怎么回事?我理解" WHERE Department IN"部分, 但后来我期待一个值,而是另一个嵌套查询 包括在内,对我来说没有多大意义,因为我只是初学者 用SQL。
嵌套查询返回用于与Department
2)偶然我能够提出另一个查询 似乎工作,但感觉很奇怪,我也不理解它 工作情况。
HAVING NOT SUM(FirstName = "Thomas") = 0
"感觉很奇怪"因为,它是。这不是SUM
函数的地方。
编辑:为什么这样做?
表达式FirstName = "Thomas"
被评估为 true 或 false (称为布尔表达式)。 True 在数字上等于1, False 转换为0(零)。通过包括SUM
你然后计算总数,所以真的为零(仍然)意味着错误和"不是零"是真的。然后让它变得奇怪(呃)你包括NOT
否定了整个事情它变成了非TRUE = 0或FALSE = FALSE(当然......是的)!!
编辑:我认为对您有用的是考虑何时使用WHERE
以及何时使用HAVING
(而不是布尔魔法发生) 。
来自this answer:
WHERE
子句在各行上引入了一个条件; HAVING
子句引入了聚合的条件,即选择结果,其中从多行生成单个结果,例如计数,平均值,最小值,最大值或总和。
WHERE
适用于您的示例,因为首先您想要"只返回行WHERE Department IN (100)
"然后你想"按Department
"对这些行进行分组。并获得COUNT
已选择的行数。