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

如何在SSRS中实现本年WTD与去年同期WTD销售增长动态对比?

解决本年WTD与去年对应周WTD销售增长的动态统计问题

原代码问题分析

你提供的SQL存在两个核心问题:

  1. WHERE子句仅定义了周起始日期,未限制截止到去年对应本周的前一日,导致返回整周数据而非WTD(本周至今)范围
  2. 仅查询了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:25:39