SQL - 计数 WHERE AGGREGATE>1 [重复]
Posted
技术标签:
【中文标题】SQL - 计数 WHERE AGGREGATE>1 [重复]【英文标题】:SQL - counting WHERE AGGREGATE>1 [duplicate] 【发布时间】:2009-09-02 17:05:05 【问题描述】:假设我有一个客户数据库表,其中包含 id,username,firstname,lastname
如果我想知道有多少个不同名字的实例,我可以这样做:
select firstname, count(*) from Customers group by 2 order by 1;
firstname | count(*)
====================
bob | 1
jeff | 2
adam | 5
如何计算多次出现的名字的数量?在伪 sql 中会是这样的:
select
COUNT(
firstname,
count(*) as num_occurrences
)
from
Customers
group by 2
having num_occurrences > 1;
【问题讨论】:
【参考方案1】:你的想法是对的:
SELECT COUNT(*)
FROM (
SELECT firstname
FROM Customers
GROUP BY firstname
HAVING COUNT(*) >= 2
)
子查询计算多次出现的名字。然后你计算所有这些名字。 HAVING
子句允许您按聚合过滤。这就像一个WHERE
子句,除了你可以使用聚合函数。
【讨论】:
这太复杂了——IniTech 的答案更好。 我更喜欢这个解决方案的想法,因为数据库只返回我感兴趣的内容。不幸的是,这在 Informix 中似乎不起作用。 :( 那么您不要在 SELECT 子句中包含该列。如果可能,应避免子选择和子查询。 这将在 IDS 11.50 中工作;它可能在 IDS 11.10 中工作;它在 IDS 的早期版本中不起作用 - 最近添加了对“FROM 子句中的子查询”的支持。 @rexem:@IniTech 的回答没有回答问题。【参考方案2】:不需要子查询。
试试:
SELECT firstname, COUNT(*)
FROM Customers
GROUP BY firstname
HAVING COUNT(*) > 1
ORDER BY firstname
或者,按最有代表性的名字排序:
SELECT firstname, COUNT(*) AS custcount
FROM Customers
GROUP BY firstname
HAVING COUNT(*) > 1
ORDER BY custcount DESC;
【讨论】:
应该引用username
,而不是firstname
。它也没有提供请求的答案 - 超过一行的用户名的数量。如果从临时表中的 INTO TEMP 后跟 SELECT 不算作子查询,您可以这样做 - 但否则...
@Jonathon:如果不显示计数适用的用户名,输出将毫无意义。
@rexem:该问题询问在表中具有多个具有相同用户名的条目的客户数量。它本身并不要求提供用户名;它询问此类用户名的数量。这是一个经典的聚合查询,子查询在 FROM 子句是最好的回答方式。
@IniTech:再看问题,好像username和firstname有点混淆。示例查询选择了名字,但假定的查询结果列出了用户名。【参考方案3】:
这样就可以了:
select count(username)
from (select username
from Customers
group by username
having count(*) > 1);
【讨论】:
注意:问题对用户名和名字感到困惑 - 这个答案使用了“用户名”,而修改后的问题与“名字”一起使用。以上是关于SQL - 计数 WHERE AGGREGATE>1 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
SQL EXISTS vs. Aggregate IS NOT NULL