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

如何仅用GROUP BY在SQL按年分组透视表中添加m0和m13列?

实现思路与修改后的SQL

当然可以实现!其实核心思路还是沿用你已经掌握的CASE表达式+GROUP BY的方式,只需要把年份和月份的组合条件加入判断逻辑,完全不需要用到JOIN、LEAD或LAG函数。

修改后的完整SQL代码

SELECT 
    client, 
    manager, 
    year,
    -- 上一年12月的值(m0)
    SUM(CASE WHEN year = t.year - 1 AND month = 12 THEN value ELSE 0 END) m0,
    -- 当年1-12月的值
    SUM(CASE WHEN month = 1 THEN value ELSE 0 END) m01,
    SUM(CASE WHEN month = 2 THEN value ELSE 0 END) m02,
    SUM(CASE WHEN month = 3 THEN value ELSE 0 END) m03,
    SUM(CASE WHEN month = 4 THEN value ELSE 0 END) m04,
    SUM(CASE WHEN month = 5 THEN value ELSE 0 END) m05,
    SUM(CASE WHEN month = 6 THEN value ELSE 0 END) m06,
    SUM(CASE WHEN month = 7 THEN value ELSE 0 END) m07,
    SUM(CASE WHEN month = 8 THEN value ELSE 0 END) m08,
    SUM(CASE WHEN month = 9 THEN value ELSE 0 END) m09,
    SUM(CASE WHEN month = 10 THEN value ELSE 0 END) m10,
    SUM(CASE WHEN month = 11 THEN value ELSE 0 END) m11,
    SUM(CASE WHEN month = 12 THEN value ELSE 0 END) m12,
    -- 下一年1月的值(m13)
    SUM(CASE WHEN year = t.year + 1 AND month = 1 THEN value ELSE 0 END) m13
FROM t
GROUP BY client, manager, year

关键逻辑说明

  • m0列:通过year = t.year - 1 AND month = 12精准匹配当前分组年份的上一年12月数据,用SUM聚合后,没有对应数据的情况会返回0,和你原有月份列的逻辑保持一致。
  • m13列:通过year = t.year + 1 AND month = 1匹配当前分组年份的下一年1月数据,同样用SUM聚合处理空值情况。

注意事项

如果某个client+manager+year组合不存在对应的上一年12月或下一年1月数据,对应的m0或m13会显示0,这和你原有月份列的默认值逻辑完全统一,不需要额外处理。

内容的提问来源于stack exchange,提问作者Room'on

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:22:47