SQL按周分日统计每日唯一门店出现次数的实现方法
问题根源
- 原统计逻辑直接对行级记录做计数,未过滤同一门店在单日产生的多条重复提交,同店多次出现时会被重复累加。
- 原逻辑未引入门店维度的去重判断,仅按日期匹配做行数统计,无法输出真实的每日唯一门店数——比如示例中2021-03-02的6行记录(含90号店的2条重复),原逻辑会计数为6,和实际需要的唯一门店数5存在偏差。
核心修正逻辑
- 每个日期维度的统计值,改为统计对应日期下去重后的门店标识数量,而非匹配的行数量。
- 利用SQL的
COUNT(DISTINCT 表达式)语法,自动剔除同一门店在同一统计维度下的重复值,从规则上避免重复计数。
修正后可直接运行的代码
-- 固定周起始为周日,匹配报表的周维度规则,避免服务器配置差异导致周数计算偏差 SET DATEFIRST 7; DECLARE @reportStartDate date SET @reportStartDate ='2021-1-03' SELECT DATEPART(wk, @reportStartDate) AS Week, -- 每个日度指标替换为:匹配当日条件时,去重计数门店ID COUNT(DISTINCT CASE WHEN DATEDIFF(dd, @reportStartDate, Site_Review_Date) = 0 THEN Store END) AS S, COUNT(DISTINCT CASE WHEN DATEDIFF(dd, @reportStartDate, Site_Review_Date) = 1 THEN Store END) AS M, COUNT(DISTINCT CASE WHEN DATEDIFF(dd, @reportStartDate, Site_Review_Date) = 2 THEN Store END) AS T, COUNT(DISTINCT CASE WHEN DATEDIFF(dd, @reportStartDate, Site_Review_Date) = 3 THEN Store END) AS W, COUNT(DISTINCT CASE WHEN DATEDIFF(dd, @reportStartDate, Site_Review_Date) = 4 THEN Store END) AS R, COUNT(DISTINCT CASE WHEN DATEDIFF(dd, @reportStartDate, Site_Review_Date) = 5 THEN Store END) AS F, COUNT(DISTINCT CASE WHEN DATEDIFF(dd, @reportStartDate, Site_Review_Date) = 6 THEN Store END) AS Sat, -- 若需TOTAL为当周累计唯一门店数,用DISTINCT计数;若需保留原总提交记录数,可改回COUNT(*) COUNT(DISTINCT Store) AS TOTAL FROM dbo.Map_Survey_Tracking -- 修正原边界范围问题:仅取当周相差0-6天的记录,避免多带入下一周数据拉高总计数 WHERE Site_Review_Date BETWEEN @reportStartDate AND DATEADD(dd, 6, @reportStartDate)
效果说明
- 针对示例数据,2021-03-02日期下的6条记录经过去重后,仅统计到90、1、3、20、87共5个唯一门店,输出结果完全匹配需求,不会再出现同店多记录被重复累加的问题。
- 原代码中存在的边界范围溢出问题(多取下一周1天的记录)也同步修正,避免统计值虚高。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

