【问题标题】:SQL - counting WHERE AGGREGATE>1 [duplicate]SQL - 计数 WHERE AGGREGATE>1 [重复]
【发布时间】: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;

【问题讨论】:

    标签: sql aggregate informix


    【解决方案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);
    

    【讨论】:

    • 注意:问题对用户名和名字感到困惑 - 这个答案使用了“用户名”,而修改后的问题与“名字”一起使用。
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2010-10-05
    • 2017-07-25
    • 2018-04-22
    • 2014-08-30
    • 2018-05-12
    • 2016-06-13
    • 2012-11-10
    相关资源
    最近更新 更多