SQL中GROUP BY如何使用?PL/SQL代码报ORA-00979错误原因是什么
报错原因
ORA-00979报错的核心是GROUP BY语法不符合Oracle规范:使用GROUP BY分组聚合的查询中,所有出现在SELECT子句的非聚合函数字段,必须同时出现在GROUP BY子句中。
当前查询SELECT子句包含4个项:
Territories.TerritoryID(非聚合字段)Territories.TerritoryDescription(非聚合字段)count(orders.orderID) as sales(聚合函数字段,无需加入GROUP BY)to_char(orders.orderDate,'MON')(非聚合字段)
而GROUP BY子句仅写了to_char(orders.orderDate,'MON'),另外两个非聚合字段未出现在GROUP BY中,因此触发语法报错。
修正方案
根据你的统计逻辑调整GROUP BY子句即可。如果你的需求是按地区+月份统计每个地区的月度订单量,将两个地区字段加入GROUP BY即可,修正后的完整代码如下:
DECLARE CURSOR cur_r IS SELECT Territories.TerritoryID, Territories.TerritoryDescription, count(orders.orderID) as sales, to_char(orders.orderDate,'MON') as order_month FROM Territories INNER JOIN Orders on Territories.TerritoryID=orders.TerritoryID GROUP BY Territories.TerritoryID, Territories.TerritoryDescription, to_char(orders.orderDate,'MON') ORDER BY sales; RES cur_r%ROWTYPE; BEGIN OPEN cur_r; LOOP FETCH cur_r INTO RES; exit WHEN cur_r%NOTFOUND; dbms_output.Put_line( '地区ID : ' || RES.TerritoryID || ' 地区描述 : ' || RES.TerritoryDescription || ' 订单月份 : ' || RES.order_month || ' 订单量 : ' || RES.sales ); END LOOP; CLOSE cur_r; END; /
GROUP BY核心使用规则
- 作用:将查询结果按指定的一个或多个字段分组,相同字段值的行归为同一组
- 语法规则:
- SELECT子句中仅允许出现两类内容:GROUP BY指定的分组字段、聚合函数(COUNT/SUM/AVG/MAX/MIN等)
- 聚合函数会对每个分组单独计算,返回每个分组的统计结果
- 若需要对聚合后的结果做筛选,需使用HAVING子句,不能使用WHERE子句
内容的提问来源于stack exchange,提问作者nim
相关产品推荐
相关产品推荐

