我可以在WHERE子句中使用COUNT()函数吗?询问总统

时间:2013-11-09 23:49:28

标签: sql count where

我有一个关系Presidents(firstName,lastName,beginTerm,endTerm) 提供有关美国总统的信息。属性firstName是一个字符串 使用名字,在某些情况下,还有一个或多个 中间名首字母。

属性lastName是一个包含总统姓氏的字符串。例如, 前任总统有firstName ='George W.'他的父亲有firstName ='George H.W.';两者都有lastName ='Bush'。最后两个属性,beginTerm和endTerm, 是总统分别进入和离职的年份。

一个微妙之处在于格罗弗克利夫兰为2个不连续服务 条款。他出现在2个元组中,一个是第一个学期的开始和结束年份,另一个是第二个学期。

我的问题如下:

有两对父亲和儿子的总统。但是这里有 其他一些共同姓氏的总统。查找属于2位或更多位总统的所有姓氏。不要重复使用姓氏,并记住,服务于2个不同条款的同一个人(例如,格罗弗·克利夫兰)不构成具有相同姓氏的2位总统的案例。

我首先想到答案可能是:

    SELECT lastName
    FROM Presidents
    WHERE COUNT(lastName) > 2
    EXCEPT lastName = 'Cleveland';

我不太确定是否可以在WHERE子句中使用COUNT()函数。 这可能吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

在检查组功能时使用HAVING而不是WHERE。

SELECT lastName
FROM Presidents
WHERE lastName != 'Cleveland'
GROUP BY lastName
HAVING COUNT(lastName) > 2;

然而,当解决SQL-puzzles喜欢这个时,你永远不应该考虑实际的数据。它应该适用于所有一致的数据集!我相信这是解决问题的实际方法:

SELECT DISTINCT p1.lastName
FROM Presidents p1, Presidents p2
WHERE p1.lastName == p2.LastName
AND p1.firstName != p2.firstName;

答案 1 :(得分:2)

您使用HAVING约束聚合,并且您也错过了一个组。

SELECT lastName
FROM Presidents
where lastName <> 'Cleveland';
group by lastname
having COUNT(lastName) > 2

答案 2 :(得分:0)

假设还有一个id字段,

select id, lastname, count(*) differentguycount
from presidents left join
(select id, firstname, lastname count(*) sameguycount
from presidents 
group by id, firstname, lastname
having sameguycount > 1 ) temp on temp.id = presidents.id
where temp.firstname is null
group by id, lastname 
having differentguycount > 1

如上所述,OP没有指定可能导致语法错误的数据库引擎。例如,某些数据库可能不允许您在having子句中使用别名。