You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并同表两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:25:27