如何在SQL Server中基于同日期匹配生成去年同期数据列?
问题描述
原有数据源由供应商提供,包含当前年度及去年同期的Dollar Sales、Unit Sales、Warehouses Selling三类数据,但供应商现已停止该服务。目前仅能获取含当前数据的数据集,需自行生成去年同期的对应数据列。
原始数据
| Date | Venue | WH # | Item | Dollar Sales | Unit Sales | Warehouses Selling |
|---|---|---|---|---|---|---|
| 5/26/2019 | Abby | 10 | Apple | $40,345.00 | 58 | 23 |
| 5/26/2019 | Bobby | 20 | HP | $19,567.00 | 32 | 57 |
| 5/26/2020 | Charlie | 20 | HP | $39,764.00 | 87 | 121 |
| 5/26/2020 | Egad | 10 | Apple | $75,347.00 | 89 | 98 |
期望输出
| Item | Dollar Sales | LY- Dollar Sales | Unit Sales | LY-Unit Sales | Warehouses Selling | LY- Warehouse Selling |
|---|---|---|---|---|---|---|
| Apple | $40,345.00 | 58 | 23 | |||
| HP | $19,567.00 | 32 | 57 | |||
| HP | $39,764.00 | $19,567 | 87 | 32 | 121 | 57 |
| Apple | $75,347.00 | $40,345 | 89 | 58 | 98 | 23 |
曾尝试用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;
逻辑说明
- 自连接匹配:将表自身作为两个数据集(t1为当前数据,t2为去年同期数据),通过
Item和WH #确保匹配的是同一商品、同一仓库的数据。 - 日期匹配:用
DATEADD(YEAR, -1, t1.Date)自动计算t1日期的去年同一天,和t2的Date做精确匹配,实现同日期对比。 - LEFT JOIN:保留所有当前数据,即使没有对应去年同期数据,对应列会显示
NULL(对应期望输出中的空值)。 - 动态适配:无需硬编码日期范围,
DATEADD会自动适配任意日期的去年同期值,适合长期维护。
注意事项
- 确保
Date列是日期类型,若为字符串需先转换:DATEADD(YEAR, -1, CONVERT(DATE, t1.Date, 101)) = CONVERT(DATE, t2.Date, 101)(101是MM/DD/YYYY格式的转换代码)。 - 替换
YourTableName为实际的表名。
内容的提问来源于stack exchange,提问作者Alleycat23
相关产品推荐
相关产品推荐

