2017-06-17 20 views
1

名前、雇用日などの情報が含まれているテーブルがあります。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 ; 

により、すべての明確なYEARあなたUSTグループを必要とするので、もしあなたがMAX(EMPL_NUMBER)の年を必要とする場合は、

できた選択結果に集計関数を使用していますオラクル12Cに
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

、あなたが行うことができます:

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

これを行う1つの方法は、使用することですすでに行っていたとおりに集約クエリを実行し、集計関数を最大限に使用することができます。例えば、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 

この溶液を有する2つの問題があります。第一に、多くの開発者(経験豊富な開発者を含む)は、FIRST/LAST機能を認識していないか、そうでなければそれを使用したくないと思われます。もう一つは、より深刻な問題は、この問題で同じ、最高の人数で数年がいる可能性があるということです。問題の要件は、オリジナルの投稿よりも詳細でなければなりません。最初の場所との結びつきがあるときに、望ましい出力は何ですか?

上記のクエリは、最大の雇用が達成されたすべての異なる年のうち最も早いものを返します。 SELECT句のMINMAXに変更すると、最も多くの雇用者が起きたときに最も新しい年が得られます。しかし、しばしば、ネクタイの場合、すべてほとんどの人のために結ばれたクエリを欲しがります。 FIRST/LAST機能では実行できません。

このため、コンパクトなソリューションは、元のクエリに分析関数を追加し、年数を人数でランク付けします。次に外側のクエリでは、rank = 1の行をフィルタリングするだけです。(代わりにランク型解析関数の)サブクエリのSELECT句でmax()分析関数を使用して

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 
; 

または、:

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; 
関連する問題