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
我有一个从三个 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