【问题标题】:Count companies with more than one contact计算有多个联系人的公司
【发布时间】:2021-09-20 10:16:51
【问题描述】:

Select count (distinct company_id)
from contacts
group by company_id
having count(contact_id) >1) from contact

我使用了这个查询,但输出带有行列表及其与超过 2 个的联系。

我正在寻找像 6 这样的单个数字作为输出。

【问题讨论】:

  • (company_id, contact_id) 上是否有唯一索引(可能应该有)?如果不是,您是否将同一联系人计为“2 个联系人”或“1 个联系人”?可以有NULL 值吗?他们算“平等”吗?请以 文本 的形式提供数据,而不是图像。并始终公开您的 Postgres 版本。

标签: sql postgresql group-by count


【解决方案1】:
select count(*) from
(
 select company_id 
 from contacts 
 where company_id is not null
 group by company_id
 having count(distinct contact_id) > 1
) t;

如果您确定所有 (company_id, contact_id) 对都是唯一的,那么 count(distinct contact_id) 就变成了简单的 count(*)

【讨论】:

  • 感谢您的回复。有一些company_id为null,并且上面有contact_id,我不想使用NULL
【解决方案2】:

这取决于细则!你评论了:

有一些company_id为null,并且上面有contact_id,我不想用NULL

所以我们排除了company_id IS NULL。仍然不清楚如何处理contact_id IS NULL。一些选项:

SELECT count(*)
FROM  (
   SELECT count(*) AS ct                    -- count all contacts
       -- count(contact_id) AS ct           -- count not-null contacts
       -- count(DISTINCT contact_id) AS ct  -- count not-null, distinct contacts
   FROM   contacts
   WHERE  company_id IS NOT NULL            -- "I dont want to use NULL"
   GROUP  BY company_id
   ) t
WHERE  ct > 1;

子查询中的HAVING 子句是等效的。外部查询中的WHERE 只是更简单的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多