如何合并同表两个SQL查询结果并统计符合条件的客户数
合并查询并统计符合条件的客户总数
你需要统计同时满足以下两个条件的客户总数:
- 客户存在
metadata_id='metadata_1'且text_value='yes!'的记录 - 客户存在
metadata_id='metadata_2'的记录
以下是几种可行的合并查询方案:
方法1:使用IN子查询
通过子查询先获取所有拥有metadata_2记录的客户,再筛选出同时满足第一个条件的客户并统计数量:
SELECT COUNT(DISTINCT customer_id) AS qualified_customers FROM my_table WHERE metadata_id='metadata_1' AND text_value='yes!' AND customer_id IN ( SELECT customer_id FROM my_table WHERE metadata_id='metadata_2' );
COUNT(DISTINCT)用于确保同一客户即使有多条符合条件的记录也只被统计一次,避免重复计数。
方法2:使用EXISTS子查询
这种方式性能通常更优,因为EXISTS会在找到匹配记录后立即停止检索,适合大数据量场景:
SELECT COUNT(DISTINCT customer_id) AS qualified_customers FROM my_table t1 WHERE t1.metadata_id='metadata_1' AND t1.text_value='yes!' AND EXISTS ( SELECT 1 FROM my_table t2 WHERE t2.customer_id = t1.customer_id AND t2.metadata_id='metadata_2' );
这里通过表别名t1和t2区分主查询和子查询,检查当前客户是否存在对应的metadata_2记录。
方法3:使用GROUP BY+HAVING
先筛选出所有符合任一条件的记录,按客户分组后通过HAVING子句验证两个条件是否同时满足:
SELECT COUNT(customer_id) AS qualified_customers FROM ( SELECT customer_id FROM my_table WHERE (metadata_id='metadata_1' AND text_value='yes!') OR metadata_id='metadata_2' GROUP BY customer_id HAVING SUM(CASE WHEN metadata_id='metadata_1' AND text_value='yes!' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN metadata_id='metadata_2' THEN 1 ELSE 0 END) > 0 ) AS filtered_customers;
子查询中通过CASE语句分别统计每个客户满足两个条件的记录数,HAVING确保两个统计数都大于0,即同时满足两个条件。
以上三种方法在你的示例数据上都会返回结果2,符合预期。
内容的提问来源于stack exchange,提问作者MartinW
相关产品推荐
相关产品推荐

