如何用窗口函数按日期分组行数据?SQL按月分组问题解决
修正SQL实现按月分组计算营收及营收增长
原始业务数据
| 日期 | 营收 |
|---|---|
| 2023-03-01 | 500 |
| 2023-03-29 | 300 |
| 2023-04-15 | 600 |
| 2023-05-11 | 300 |
| 2023-05-23 | 600 |
| 2023-05-31 | 500 |
原代码问题
原SQL的核心错误点:
GROUP BY OrderDate按具体单日分组,无法实现同一月份数据的聚合LAG(Amount)直接引用原始行的营收值,没有基于月度总营收计算环比增长,逻辑不符合需求
修正后的SQL代码
WITH MonthlyRevenue AS ( SELECT DATENAME(month, OrderDate) AS MonthName, DATEFROMPARTS(YEAR(OrderDate), MONTH(OrderDate), 1) AS MonthStart, SUM(Amount) AS TotalRevenue FROM OrderDetail GROUP BY YEAR(OrderDate), MONTH(OrderDate), DATENAME(month, OrderDate) ) SELECT MonthName AS 日期, TotalRevenue AS 营收, ISNULL(TotalRevenue - LAG(TotalRevenue) OVER (ORDER BY MonthStart ASC), 0) AS 营收增长 FROM MonthlyRevenue
代码说明
- 月度聚合层:通过
YEAR(OrderDate)和MONTH(OrderDate)分组,确保同一自然月的所有记录被聚合;生成MonthStart作为排序基准,避免月份名称按字母排序导致顺序混乱 - 环比增长计算:在聚合后的月度数据上使用
LAG()函数获取上月总营收,计算差值;首月无上月数据时用ISNULL()返回0 - 字段映射:将结果字段名对应为期望的中文名称
最终输出结果
| 日期 | 营收 | 营收增长 |
|---|---|---|
| March | 800 | 0 |
| April | 600 | -200 |
| May | 1400 | 800 |
内容的提问来源于stack exchange,提问作者User_K47
相关产品推荐
相关产品推荐

