使用Oracle分析函数OVER PARTITION BY计算累计销售额遇GROUP BY错误求助
解决"not a group by"错误并计算累计销售额
你的问题出在多余的GROUP BY子句上,窗口函数SUM(sales) OVER (...)本身就可以基于原始数据计算累计值,不需要提前分组。
错误原因
你写的查询里,GROUP BY country,month,sales完全是画蛇添足:
- 窗口函数是对每一行数据逐行计算累计,而GROUP BY会把相同字段组合的行合并,两者逻辑冲突
- 在严格的SQL模式下(比如MySQL的ONLY_FULL_GROUP_BY),SELECT中的列要么是GROUP BY的字段,要么是聚合函数,窗口函数不属于这个范畴,因此触发报错
正确查询(分两种场景)
场景1:原表中每个国家+月份仅对应一行销售数据(和你提供的数据源匹配)
直接去掉GROUP BY即可:
select country, month, sales, sum(sales) over (partition by country order by month) as cumulative_sales from check2
场景2:原表中同一个国家+月份有多条销售记录(比如每日明细数据)
需要先聚合出每月销售额,再计算累计:
select country, month, monthly_sales, sum(monthly_sales) over (partition by country order by month) as cumulative_sales from ( select country, month, sum(sales) as monthly_sales from check2 group by country, month ) as monthly_data
结果验证
按第一种场景执行后,就能得到你期望的结果:每个国家按月份排序,每行显示当月销售额和截至当月的累计销售额。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

