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

如何在SQL Server中基于同日期匹配生成去年同期数据列?

问题描述

原有数据源由供应商提供,包含当前年度及去年同期的Dollar Sales、Unit Sales、Warehouses Selling三类数据,但供应商现已停止该服务。目前仅能获取含当前数据的数据集,需自行生成去年同期的对应数据列。

原始数据

DateVenueWH #ItemDollar SalesUnit SalesWarehouses Selling
5/26/2019Abby10Apple$40,345.005823
5/26/2019Bobby20HP$19,567.003257
5/26/2020Charlie20HP$39,764.0087121
5/26/2020Egad10Apple$75,347.008998

期望输出

ItemDollar SalesLY- Dollar SalesUnit SalesLY-Unit SalesWarehouses SellingLY- Warehouse Selling
Apple$40,345.005823
HP$19,567.003257
HP$39,764.00$19,567873212157
Apple$75,347.00$40,34589589823

曾尝试用Excel实现,但仅支持按月匹配而非同日期匹配,故转向SQL Server处理。已5年未接触SQL,对计算逻辑无从下手。此前尝试硬编码日期范围生成列,但该方式难以长期维护,需可行方向。

解决方案

使用SQL Server的DATEADD函数计算去年同日期,通过**自连接(LEFT JOIN)**匹配相同Item和WH #的去年同期数据,无需硬编码日期,可长期复用。

示例SQL代码

SELECT
    t1.Item,
    t1.[Dollar Sales],
    t2.[Dollar Sales] AS [LY- Dollar Sales],
    t1.[Unit Sales],
    t2.[Unit Sales] AS [LY-Unit Sales],
    t1.[Warehouses Selling],
    t2.[Warehouses Selling] AS [LY- Warehouse Selling]
FROM
    YourTableName t1
LEFT JOIN
    YourTableName t2 ON 
        t1.Item = t2.Item
        AND t1.[WH #] = t2.[WH #]
        AND DATEADD(YEAR, -1, t1.Date) = t2.Date
ORDER BY
    t1.Date, t1.Item;

逻辑说明

  1. 自连接匹配:将表自身作为两个数据集(t1为当前数据,t2为去年同期数据),通过Item和WH #确保匹配的是同一商品、同一仓库的数据。
  2. 日期匹配:用DATEADD(YEAR, -1, t1.Date)自动计算t1日期的去年同一天,和t2的Date做精确匹配,实现同日期对比。
  3. LEFT JOIN:保留所有当前数据,即使没有对应去年同期数据,对应列会显示NULL(对应期望输出中的空值)。
  4. 动态适配:无需硬编码日期范围,DATEADD会自动适配任意日期的去年同期值,适合长期维护。

注意事项

  • 确保Date列是日期类型,若为字符串需先转换:DATEADD(YEAR, -1, CONVERT(DATE, t1.Date, 101)) = CONVERT(DATE, t2.Date, 101)(101是MM/DD/YYYY格式的转换代码)。
  • 替换YourTableName为实际的表名。

内容的提问来源于stack exchange,提问作者Alleycat23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:40:16