如何统计年访问次数超1次的客户总量及SQL语句修改
解决方法:统计每年访问次数超1次的客户总数
你的问题核心是没有在合适的阶段筛选出访问次数超过1次的客户,同时外层查询的分组逻辑不符合最终需求(你要的是年度总数,不是按访问次数拆分的明细)。我们可以通过两个关键修改来实现目标:
1. 在子查询中用HAVING筛选访问次数>1的客户
子查询原本是计算每个客户每年的访问次数,我们可以直接在这里加上HAVING count(*) > 1,提前过滤掉访问次数≤1的客户,减少后续计算的数据量——这也正好解决了SQL提示你需要用HAVING子句的问题(聚合函数的筛选必须用HAVING,不能用WHERE)。
2. 调整外层查询的分组与统计逻辑
外层不需要再按num_visits分组,只需要按年份分组,统计符合条件的客户总数即可。
修改后的完整SQL
select date_visit as 'Date', count(cst_mobile) as 'Customer Amount' from ( select LEFT(CONVERT(datetime2, datevisit, 120), 4) as date_visit, v.cst_mobile, count(*) as num_visits from users v where class_user='Premium' and cst_id != 0 and cst_mobile not like '%000000%' and cst_mobile!='' group by LEFT(CONVERT(datetime2, datevisit, 120), 4), cst_mobile -- 新增HAVING子句,筛选访问次数超过1次的客户 HAVING count(*) > 1 ) v group by date_visit order by date_visit desc
效果说明
对应你给出的2020年示例数据,执行后会直接返回该年份访问次数超1次的客户总量:2258+804+166+56 = 3284,完全符合你的统计需求。
内容的提问来源于stack exchange,提问作者Anil




