如何在SSRS中实现本年WTD与去年同期WTD销售增长动态对比?
解决本年WTD与去年对应周WTD销售增长的动态统计问题
原代码问题分析
你提供的SQL存在两个核心问题:
- WHERE子句仅定义了周起始日期,未限制截止到去年对应本周的前一日,导致返回整周数据而非WTD(本周至今)范围
- 仅查询了2021年单一年份的数据,未包含本年WTD的对比数据,无法计算增长
修正后的解决方案
下面的代码会动态计算日期范围,同时统计本年(截止前一日)和去年对应周的WTD销售额,并计算增长率:
步骤1:定义关键日期变量
先通过变量获取动态日期,确保每日运行时自动适配:
DECLARE @PrevDay DATE = DATEADD(DAY, -1, GETDATE()); -- 报表统计截止日:前一日 DECLARE @CurrentYear INT = YEAR(@PrevDay); DECLARE @LastYear INT = @CurrentYear - 1; -- 计算本年WTD范围:本周第一天 至 前一日 -- 注意:DATEFIRST设置决定周起始(默认周日为1,若需周一为起始,将1改为2) DECLARE @CurrentWTDStart DATE = DATEADD(DAY, 1 - DATEPART(dw, @PrevDay), @PrevDay); DECLARE @CurrentWTEnd DATE = @PrevDay; -- 计算去年对应周的WTD范围:去年的本周第一天 至 去年的对应前一日 DECLARE @LastYearPrevDay DATE = DATEADD(YEAR, -1, @PrevDay); DECLARE @LastWTDStart DATE = DATEADD(DAY, 1 - DATEPART(dw, @LastYearPrevDay), @LastYearPrevDay); DECLARE @LastWTEnd DATE = @LastYearPrevDay;
步骤2:合并两年数据并计算指标
如果你的销售数据按年份分表(如DailySales2021、DailySales2024),先用UNION ALL合并;如果是单表则直接查询:
WITH CombinedSales AS ( -- 替换为你实际的年份表 SELECT storeid, CONVERT(DATE, date) AS sale_date, Sales FROM dbo.DailySales2021 UNION ALL SELECT storeid, CONVERT(DATE, date) AS sale_date, Sales FROM dbo.DailySales2022 UNION ALL SELECT storeid, CONVERT(DATE, date) AS sale_date, Sales FROM dbo.DailySales2023 UNION ALL SELECT storeid, CONVERT(DATE, date) AS sale_date, Sales FROM dbo.DailySales2024 ) SELECT storeid, -- 本年WTD销售额 SUM(CASE WHEN sale_date BETWEEN @CurrentWTDStart AND @CurrentWTEnd THEN Sales ELSE 0 END) AS CurrentYearWTDSales, -- 去年对应周WTD销售额 SUM(CASE WHEN sale_date BETWEEN @LastWTDStart AND @LastWTEnd THEN Sales ELSE 0 END) AS LastYearWTDSales, -- 计算增长率,处理去年销售额为0的情况避免除零错误 CASE WHEN SUM(CASE WHEN sale_date BETWEEN @LastWTDStart AND @LastWTEnd THEN Sales ELSE 0 END) = 0 THEN NULL ELSE ROUND( (SUM(CASE WHEN sale_date BETWEEN @CurrentWTDStart AND @CurrentWTEnd THEN Sales ELSE 0 END) - SUM(CASE WHEN sale_date BETWEEN @LastWTDStart AND @LastWTEnd THEN Sales ELSE 0 END)) * 100.0 / SUM(CASE WHEN sale_date BETWEEN @LastWTDStart AND @LastWTEnd THEN Sales ELSE 0 END), 2 ) AS GrowthRatePercent FROM CombinedSales WHERE sale_date BETWEEN @LastWTDStart AND @CurrentWTEnd -- 过滤仅需的日期范围 GROUP BY storeid;
关键说明
- 动态日期适配:通过
@PrevDay自动获取前一日,确保报表每日运行时统计截止到前一天的数据 - 周起始调整:如果你的业务以周一作为一周的第一天,将
1 - DATEPART(dw, ...)改为2 - DATEPART(dw, ...);或用ISO周逻辑(DATEPART(ISO_WEEK, ...)),避免跨年周的统计误差 - 增长率处理:增加了去年销售额为0时返回NULL的逻辑,避免出现除零错误
- 分表兼容:通过CTE合并年份表,适配按年存储数据的场景
内容的提问来源于stack exchange,提问作者wyh3574
相关产品推荐
相关产品推荐

