2017-06-17 76 views
1

我有一张表o员工包含姓名,工作日期和一些更多信息。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); 

而且结果是元组:

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列元组。

回答

1

您在选择结果使用的聚合功能,因此如果你需要的所有不同的一年你乌斯组由

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 ) 
+0

该查询返回与子查询相同的结果。 – user

+0

但您没有错误... ..正确吗? – scaisEdge

+0

答案更新为获取最大年份(EMPL_NUMBER) – scaisEdge

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; 
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函数,或者不愿意使用它。另一个更严重的问题是,在这个问题中,可能会有几年的雇员人数相同,人数最多。问题要求必须比原始帖子更详细。第一名有关系时,期望的输出是什么?

以上查询返回最大雇佣人数达到时所有不同年份的最早值。将SELECT子句中的MIN更改为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 
; 
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;