首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle SQL 錯誤排查:to_char 與 group by 引發的「非單組分組函數」問題

     編輯:程式設計綜合問答

原始錯誤 SQL

select to_char(hiredate,'MM') from (
    select deptno, MAX(sal) from emp 
    group by deptno having deptno = 10
);

錯誤原因分析

  1. 子查詢 SELECT 列表與 GROUP BY 不匹配:子查詢 `select deptno, MAX(sal)` 只分組了 `deptno`,但外層引用 `hiredate`,而 `hiredate` 既不在 GROUP BY 中,也未包含在聚合函數中 → ORA-00979: not a GROUP BY expression。
  2. 邏輯意圖不清:想查詢 10 號部門每月最高薪資的入職月份?還是單純列出該部門員工入職月份?原 SQL 無法表達明確業務。

正確寫法示例

場景 A:查詢 10 號部門每位員工的入職月份(無聚合)

select to_char(hiredate, 'MM') as hire_month
from emp
where deptno = 10;

場景 B:查詢 10 號部門每月的最高薪資

select to_char(hiredate, 'YYYY-MM') as hire_month, max(sal) as max_sal
from emp
where deptno = 10
group by to_char(hiredate, 'YYYY-MM')
order by hire_month;

場景 C:查詢 10 號部門最高薪資對應的入職月份(需關聯)

select to_char(e.hiredate, 'MM') as hire_month
from emp e
join (
    select max(sal) as max_sal from emp where deptno = 10
) m on e.sal = m.max_sal and e.deptno = 10;

最佳回答中的簡化版

select hd, max(sal) 
from (
    select to_char(hiredate,'yyyymm') hd, sal 
    from emp 
    where deptno=10
) 
group by hd;

此寫法將「按入職年月分組,求每組最高薪資」,邏輯清晰,符合 SQL 標準。

核心原則回顧

  • SELECT 列表 = GROUP BY 列 + 聚合函數,不允許出現「既未分組也未聚合」的列。
  • 使用子查詢或 CTE 先過濾/轉換,再聚合,可避免混淆。
  • to_char(date, 'fmt') 格式化字串區分大小寫,'MM'=月,'MON'=月縮寫,'YYYY'=四位年。

調試技巧

  1. 先跑子查詢,確認返回列與數據。
  2. 逐層添加 GROUP BY、聚合函數,觀察報錯位置。
  3. 善用 EXPLAIN PLAN 查看執行計劃,優化性能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved