Oracle按年月分组求和报not group by expression错误求助
错误原因说明
你编写的SQL存在两处核心问题:
- 语法顺序错误:Oracle SQL中
WHERE子句必须放在GROUP BY子句之前,你写反了子句顺序。 - 逻辑与需求不匹配:普通
GROUP BY会按分组维度将多行合并为1行,你需要保留所有原始行的场景不适用这种写法;同时普通GROUP BY要求SELECT后的非聚合字段必须全部出现在GROUP BY列表中,你SELECT了Date_a、cl_id两个字段,但GROUP BY里仅声明了年月维度,所以会报not group by expression错误。
正确实现方案
你需要使用Oracle的窗口函数(分析函数)实现分组聚合且不合并原始行的效果,参考写法如下:
SELECT Date_a, cl_id, SUM(amount) OVER ( PARTITION BY EXTRACT(YEAR FROM Date_a), EXTRACT(MONTH FROM Date_a), cl_id ) AS sum_A FROM table1 WHERE cl_id = '010';
也可以用TRUNC函数简化年月分组的写法,执行效率更高:
SELECT Date_a, cl_id, SUM(amount) OVER (PARTITION BY TRUNC(Date_a, 'MM'), cl_id) AS sum_A FROM table1 WHERE cl_id = '010';
注意:如果你的
Date_a字段存储类型为字符串而非DATE类型,需要先转换为DATE类型再处理,写法如下:SELECT Date_a, cl_id, SUM(amount) OVER (PARTITION BY TRUNC(TO_DATE(Date_a, 'DD.MM.YYYY'), 'MM'), cl_id) AS sum_A FROM table1 WHERE cl_id = '010';
内容的提问来源于stack exchange,提问作者crazier
相关产品推荐
相关产品推荐

