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

如何用窗口函数按日期分组行数据?SQL按月分组问题解决

修正SQL实现按月分组计算营收及营收增长

原始业务数据

日期营收
2023-03-01500
2023-03-29300
2023-04-15600
2023-05-11300
2023-05-23600
2023-05-31500

原代码问题

原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

代码说明

  1. 月度聚合层:通过YEAR(OrderDate)和MONTH(OrderDate)分组,确保同一自然月的所有记录被聚合;生成MonthStart作为排序基准,避免月份名称按字母排序导致顺序混乱
  2. 环比增长计算:在聚合后的月度数据上使用LAG()函数获取上月总营收,计算差值;首月无上月数据时用ISNULL()返回0
  3. 字段映射:将结果字段名对应为期望的中文名称

最终输出结果

日期营收营收增长
March8000
April600-200
May1400800

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:42:49