如何仅用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
相关产品推荐
相关产品推荐

