2017-06-17 75 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;