SQL技术问询:如何用不同WHERE条件从同一列取值并合并结果
合并潜在客户统计查询的解决方案
嗨,我来帮你搞定这个问题!其实你不需要用JOIN、UNION或者复杂的子查询,用条件聚合就能一次性得到你想要的结果——同时统计每月总潜在客户数和Rent类潜在客户数,而且只需要扫描一次数据表,性能更优。
最终SQL查询代码
SELECT TO_CHAR(a.created_at, 'YYYY.MM') AS Datum, COUNT(DISTINCT a.lead_demand_user_id) AS Total_Leads, COUNT(DISTINCT CASE WHEN a.service IN ('Leads::Rent') THEN a.lead_demand_user_id END) AS Rent_Leads FROM leads a WHERE DATE(a.created_at) BETWEEN '2017-06-01' AND CURRENT_DATE AND a.lead_delivery_time IS NOT NULL AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web') GROUP BY 1 ORDER BY 1;
代码说明
- Total_Leads:和你原来的第一个查询逻辑完全一致,统计所有符合筛选条件的去重潜在客户ID数量。
- Rent_Leads:用
CASE WHEN精准筛选出service为Leads::Rent的记录,只对这些记录的lead_demand_user_id进行去重计数;不符合条件的记录会返回NULL,而COUNT函数会自动忽略NULL值,正好匹配我们的统计需求。 - 把原来的
'TODAY'换成了CURRENT_DATE,这是标准SQL中获取当前日期的写法,比字符串常量更可靠(部分数据库对'TODAY'的支持存在差异)。 - 最后加上
ORDER BY 1可以让结果按月份顺序排列,查看起来更直观。
这个方法的核心优势在于只需要对leads表做一次全扫描,比分开执行两次查询或者用JOIN关联结果集的效率高很多,尤其是在数据表数据量较大的时候。
内容的提问来源于stack exchange,提问作者user3441346
相关产品推荐
相关产品推荐

