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

执行Oracle SQL查询报ORA-00979非GROUP BY表达式错误如何解决

问题原因
  • 核心规则不匹配:Oracle要求使用GROUP BY子句时,SELECT列表中所有未被聚合函数(COUNT/SUM/MAX/MIN等)包裹的字段,必须完整出现在GROUP BY的字段列表中。你的查询SELECT后有8个非聚合字段,但GROUP BY后仅写了SECTION_NAME一个字段,完全不符合规则,直接触发ORA-00979报错。
  • 存在低级语法错误:原SQL中GROUP BY EMP_OFFICIAL.SECTION_NAMEORDER BY 部分,SECTION_NAME和ORDER之间漏了空格,属于拼写错误,即使GROUP BY规则符合也无法正常执行。
解决办法

先明确你使用GROUP BY的实际需求,对应调整即可:

场景1:仅需要查询符合条件的员工列表,不需要分组统计

直接删除多余的GROUP BY子句即可,修正后的SQL如下:

SELECT FIRST_NAME,
       MIDDLE_NAME,
       LAST_NAME,
       EMP_MOBILE_NO,
       NEW_EMPNO ,
       SECTION_NAME,
       EMP_TYPE,
       JOINING_DATE
FROM EMP_OFFICIAL,EMP_PERSONAL 
WHERE EMP_PERSONAL.STATUS='Active'
  AND EMP_OFFICIAL.WORK_ENT='Worker'
  AND EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO
ORDER BY EMP_PERSONAL.NEW_EMPNO DESC

注:也建议把老旧的隐式连接写法换成显式INNER JOIN写法,可读性更强

场景2:需要按部门(SECTION_NAME)做分组统计

把SELECT列表调整为聚合字段+GROUP BY字段即可,比如统计每个部门的在职工人数量:

SELECT SECTION_NAME,
       COUNT(*) AS EMP_CNT
FROM EMP_OFFICIAL
INNER JOIN EMP_PERSONAL ON EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO
WHERE EMP_PERSONAL.STATUS='Active'
  AND EMP_OFFICIAL.WORK_ENT='Worker'
GROUP BY SECTION_NAME
ORDER BY EMP_CNT DESC

场景3:需要按部门分组,每个部门仅取1条员工记录

用窗口函数实现即可,不需要写GROUP BY:

SELECT * FROM (
    SELECT FIRST_NAME,
           MIDDLE_NAME,
           LAST_NAME,
           EMP_MOBILE_NO,
           NEW_EMPNO ,
           SECTION_NAME,
           EMP_TYPE,
           JOINING_DATE,
           ROW_NUMBER() OVER(PARTITION BY SECTION_NAME ORDER BY NEW_EMPNO DESC) AS RN
    FROM EMP_OFFICIAL
    INNER JOIN EMP_PERSONAL ON EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO
    WHERE EMP_PERSONAL.STATUS='Active'
      AND EMP_OFFICIAL.WORK_ENT='Worker'
) T WHERE RN = 1
ORDER BY NEW_EMPNO DESC

内容的提问来源于stack exchange,提问作者MD Amin Uddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:42:00