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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:06:08