SQL查询如何添加上年同期累计销售额列(PYRunnTot)
解决方案
要实现获取上一年同期累计销售额的需求,你可以先通过CTE(公用表表达式)计算出所有日期的当年累计值,再通过自连接关联上一年同期的记录,提取对应的累计销售额。以下是具体的SQL实现:
WITH SalesWithRunningTot AS ( SELECT date, Sales, SUM(Sales) OVER (PARTITION BY YEAR(date) ORDER BY date) AS RunningTot FROM Sales ) SELECT s1.date, s1.Sales, s1.RunningTot, s2.RunningTot AS PYRunnTot FROM SalesWithRunningTot s1 LEFT JOIN SalesWithRunningTot s2 ON DATEADD(YEAR, -1, s1.date) = s2.date;
思路说明
- CTE计算累计值:先通过
SalesWithRunningTot这个CTE生成包含日期、销售额、当年累计销售额的数据集,这部分和你原查询的逻辑一致。 - 自连接关联上年同期:通过
LEFT JOIN将CTE自身关联,连接条件为当前日期减去一年后等于关联表的日期,这样就能精准匹配上一年同期的记录,进而取出对应的累计销售额作为PYRunnTot。如果没有上一年同期的记录(比如最早年份的日期),PYRunnTot会显示为NULL,符合你期望的结果格式。
数据库兼容说明
如果你的数据库不支持DATEADD函数(比如MySQL),可以改用DATE_SUB函数调整日期:
WITH SalesWithRunningTot AS ( SELECT date, Sales, SUM(Sales) OVER (PARTITION BY YEAR(date) ORDER BY date) AS RunningTot FROM Sales ) SELECT s1.date, s1.Sales, s1.RunningTot, s2.RunningTot AS PYRunnTot FROM SalesWithRunningTot s1 LEFT JOIN SalesWithRunningTot s2 ON DATE_SUB(s1.date, INTERVAL 1 YEAR) = s2.date;
内容的提问来源于stack exchange,提问作者Thomas Soffiati
相关产品推荐
相关产品推荐

