如何通过单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
相关产品推荐
相关产品推荐

