我有一个表格,里面有我每天的销售数据.

Date Sales
3/1/2023 800
3/2/2023 300
3/3/2023 500
4/1/2023 300
4/2/2023 500
4/3/2023 200
5/1/2023 100
5/2/2023 400
5/3/2023 400

预期输出:

Date Sales Diff
5/1/2023 900 100
4/1/2023 1000 600
3/1/2023 1600 0

我创建了一个查询来获取每个月的销售额,并且我需要计算上个月和下个月之间的差额:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, Salesdate), 0) AS TrendStartDate,
       SUM(Sales) AS TotalSales ,
       LEAD(SUM(Sales), 1) OVER (PARTITION BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Salesdate), 0)
ORDER BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Salesdate), 0) DESC) AS Sales_diff 
FROM salestable
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Salesdate), 0)
ORDER BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Salesdate), 0) ASC

有谁能帮个忙吗?

推荐答案

您可以先应用简单聚合,然后聚合:

  • 最小日期,
  • 销售总额 但在以下位置进行分区:
  • 年份日期,
  • 月份日期

然后,您可以使用LAG窗口功能来收集您之前的销售总额.

SELECT MIN(Date) AS Date, 
       SUM(Sales) AS TotalSales,
       LAG(SUM(Sales), 1, SUM(Sales)) OVER(ORDER BY YEAR(Date), MONTH(Date)) - SUM(Sales) AS Diff
FROM tab
GROUP BY YEAR(Date), MONTH(Date)
ORDER BY Date DESC

最后ORDER BY个不是必需的,它只是用于可视化目的.

Output:

Date TotalSales Diff
2023-05-01 900 100
2023-04-01 1000 600
2023-03-01 1600 0

查看演示here.

Sql相关问答推荐

SQL更新,在2个额外的表上使用内部连接

用相同值更新行

数据库索引:如何使用名称和类别对项目进行最佳索引?

将重复的值更新为下一个空闲数字

如何利用单列历史SQLsnowflake获得合并结果

从包含PostgreSQL中的JSON值的列中提取列表或目录

postgres中的条件索引和触发器

将时间范围划分为全天和前后剩余小时

使用CTE在SNOWFLAKE中创建临时表

Postgresql - 如何根据阈值计算累积和

JSON对象查询SQL服务器

BigQuery数组是否包含NULL值的判断方法

如何根据共同列值从两个表中包含列,但只包含左表中的行

如何从一张表中获取值在至少三行相同的记录

Postgres数据库维护:基于GROUP BY删除旧记录

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

SQL Server 查找存在于所有不同时期(或序列)中的条目

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

连续几天购买的客户

条件前置值