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

如何通过单SQL查询实现带分支日期条件的按Source统计客户数?

单查询替代两次统计的最优方案

嘿,刚好能帮你解决这个问题!你完全可以用单条SQL查询来替代两次查询,而且能避免自连接带来的重复统计问题,下面给你两种靠谱的方案:

方案一:WHERE条件过滤后分组统计

这个方案最直观,先通过WHERE子句筛选出所有符合要求的记录,再按Source分组统计数量,逻辑清晰且效率不错:

SELECT 
    Source,
    COUNT(*) AS customer_count
FROM JCS
WHERE 
    -- 非AA、CC分支的所有记录
    Branch NOT IN ('AA', 'CC')
    -- 或者 AA、CC分支且Bill_date在9月1日之后的记录
    OR (Branch IN ('AA', 'CC') AND Bill_date > '2024-09-01')
GROUP BY Source;

关键细节提醒:

这里我用了Bill_date > '2024-09-01'而不是你原来的day(Bill_date) > 1,因为day()函数只提取日期的“日”部分,会错误统计其他月份(比如10月、11月)的2号及以后的数据,这肯定不是你想要的。如果你的需求是9月2日及以后,可以改成Bill_date >= '2024-09-02',根据实际业务调整即可。

方案二:条件聚合函数统计

如果后续需要扩展需求(比如同时展示多维度统计),可以用CASE WHEN配合聚合函数实现,同样是单条查询:

SELECT 
    Source,
    COUNT(
        CASE 
            -- 符合条件的记录才计数
            WHEN (Branch NOT IN ('AA', 'CC')) OR (Branch IN ('AA', 'CC') AND Bill_date > '2024-09-01')
            THEN Card_no 
        END
    ) AS customer_count
FROM JCS
GROUP BY Source;

因为Card_no是表的唯一字段,用它来计数能确保不会重复统计(哪怕表中有意外重复行,不过你说Card_no唯一,所以直接COUNT(*)也没问题)。

为什么自连接会重复统计?

你之前尝试自连接出现重复,是因为自连接会让符合条件的行被多次匹配关联,导致同一条记录被计数多次。而上面的两种方案都是基于原始表的行进行一次筛选或条件判断,再分组统计,完全不会有重复的问题。

内容的提问来源于stack exchange,提问作者Karthik S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:36:45