ORACLE 12c - "不是单组组功能"

时间:2017-06-17 18:17:27

标签: sql oracle oracle12c

我有一张员工表,其中包含姓名,工作日期和更多信息。

我想查看雇员人数最多的是哪一年。

我写了一个计算每年就业的查询:

SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
            FROM employees e1
            GROUP BY EXTRACT (YEAR FROM e1.empl_date);

此查询的结果是元组:

YEAR   | EMPL_NUMBER
1993   | 3
1997   | 2

依旧......

现在我想获得最大的EMPL_NUMBER:

SELECT YEAR, MAX(EMPL_NUMBER)
FROM (SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
        FROM employees e1
        GROUP BY EXTRACT (YEAR FROM e1.empl_date));

然后我收到一个错误:

ORA-00937: not a single-group group function

我不明白为什么我会收到错误,因为子查询会返回2列的元组。

4 个答案:

答案 0 :(得分:1)

您正在选择结果上使用聚合函数,因此如果您需要所有不同的YEAR,则按

分组
  SELECT T.YEAR, MAX(T.EMPL_NUMBER)
  FROM (
      SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
      FROM employees e1
      GROUP BY EXTRACT (YEAR FROM e1.empl_date)
  ) T 
  GROUP BY T.YEAR ;

否则,如果你需要MAX的年份(EMPL_NUMBER),你可以

  SELECT T.YEAR, T.EMPL_NUMBER
  FROM  (
      SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
      FROM employees e1
      GROUP BY EXTRACT (YEAR FROM e1.empl_date)
  ) T
  WHERE (T.EMPL_NUMBER)  IN (SELECT  MAX(EMPL_NUMBER)
     FROM (
      SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
      FROM employees e1
      GROUP BY EXTRACT (YEAR FROM e1.empl_date)
  ) T1  )

答案 1 :(得分:0)

在Oracle 12C中,您可以执行以下操作:

SELECT EXTRACT(YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT(YEAR FROM e1.empl_date)
ORDER BY COUNT(e1.id_empl) DESC
FETCH FIRST 1 ROW ONLY;

答案 2 :(得分:0)

执行此操作的一种方法是使用聚合查询,然后再使用聚合函数。例如,使用FIRST/LAST函数(并使用SCOTT架构,EMP表进行说明):

select min(extract(year from hiredate)) keep (dense_rank last order by count(empno)) as yr,
       max(count(empno)) as emp_count
from   emp
group by extract(year from hiredate)
;


  YR  EMP_COUNT
----  ---------
1981         10

此解决方案存在两个问题。首先,许多开发人员(包括许多有经验的开发人员)似乎没有意识到FIRST / LAST功能,或者不愿意使用它。另一个更严重的问题是,在这个问题中,有几年可能有相同,最多的雇员。问题要求必须比原始帖子更详细。当有第一名的关系时,期望的输出是什么?

上述查询返回了达到最高雇员时所有不同年份中最早的一年。将MIN条款中的SELECT更改为MAX,您将获得最多招聘人数最多的一年。但是,我们通常需要一个查询,在关联的情况下,将返回所有与大多数雇员相关的年份。使用FIRST/LAST功能无法完成

为此,紧凑型解决方案会为您的原始查询添加分析功能,以按招聘人数对年份进行排名。然后在外部查询中只过滤rank = 1的行。

select yr, emp_count
from   (
         select   extract(year from hiredate) as yr, count(empno) as emp_count,
                  rank() over (order by count(empno) desc) as rnk
         from     emp
         group by extract(year from hiredate)
       )
where  rnk = 1
;

或者,使用子查询的max()子句中的SELECT分析函数(而不是秩类型分析函数):

select yr, emp_count
from   (
         select   extract(year from hiredate) as yr, count(empno) as emp_count,
                  max(count(empno)) over () as max_count
         from     emp
         group by extract(year from hiredate)
       )
where  emp_count = max_count
;

答案 3 :(得分:0)

我假设您想要一行显示大多数人雇用的年份:

SELECT * FROM (
    SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, 
           COUNT(e1.id_empl) AS EMPL_NUMBER
    FROM employees e1
    GROUP BY EXTRACT (YEAR FROM e1.empl_date)
    ORDER BY COUNT(*))
WHERE ROWNUM=1;