SQL 不同联合的计数

SQL count of distinct union

我有一个从三个 table 中捕获客户 ID 的查询(每个 table 是不同的联系方式)。 我想在联合后获得不同客户 ID 的数量。

下面的 SQL 语句有效,returns 唯一客户 ID 列表(无重复):

SELECT DISTINCT customer_id
  FROM email_contact
 WHERE info_id = 1
   AND status = 'SENT' 
UNION
SELECT DISTINCT customer_id
  FROM call_contact
 WHERE info_id = 1
   AND status = 'CALLED' 
UNION  
SELECT DISTINCT customer_id
  FROM mail_contact
 WHERE info_id = 1
   AND status = 'MAILED'

从该查询中,我想要计算客户数量,但我尝试将查询包装在 select 计数中,却一直产生语法错误。如何包装工会来为我提供客户数量?

这是你的蚂蚁吗?

SELECT COUNT(*)
FROM ((SELECT customer_id
       FROM email_contact
       WHERE info_id = 1 AND status = 'SENT' 
      ) UNION  -- on purpose to remove duplicates
      (SELECT customer_id
       FROM call_contact
       WHERE info_id = 1 AND status = 'CALLED' 
      ) UNION  
      (SELECT customer_id
       FROM mail_contact
       WHERE info_id = 1 AND status = 'MAILED'
      )
     ) c;

请注意,您所有的 DISTINCT 都是不必要的,因为 UNION 删除了重复项。

我会推荐:

SELECT COUNT(DISTINCT customer_id)
FROM (
    SELECT customer_id FROM email_contact WHERE info_id = 1 AND status = 'SENT' 
    UNION ALL SELECT customer_id FROM call_contact WHERE info_id = 1 AND status = 'CALLED' 
    UNION ALL SELECT customer_id FROM mail_contact WHERE info_id = 1 AND status = 'MAILED'
) t

我删除了 DISTINCT 并将 UNION 更改为 UNION ALL,因此数据库只收集来自 3 个联合成员的所有行,而不尝试管理重复项(这很快)。然后,您可以在外部查询中使用 COUNT(DISTINCT ...)

可以这样包起来

SELECT COUNT(*)
FROM
(        SELECT DISTINCT customer_id
          FROM email_contact
         WHERE info_id = 1
           AND status = 'SENT' 
        UNION
        SELECT DISTINCT customer_id
          FROM call_contact
         WHERE info_id = 1
           AND status = 'CALLED' 
        UNION  
        SELECT DISTINCT customer_id
          FROM mail_contact
         WHERE info_id = 1
           AND status = 'MAILED') t1