Максимум средних - PullRequest
       12

Максимум средних

3 голосов
/ 13 марта 2010

Я должен получать среднюю заработную плату в каждом отделении и показывать только отдел с самой высокой средней заработной платой. Я понял этот запрос, но он не работает. У кого-нибудь есть идеи?

SELECT department, max(avg(wage))
FROM employees
GROUP BY department;

Я получаю эту ошибку: ОШИБКА в строке 1: ORA-00937: нет функции для одной группы

Ответы [ 4 ]

4 голосов
/ 13 марта 2010

Без CTE вы можете сделать:

Select Z.Department, Z.AvgWage
From  (
        Select Department, Avg(Wage) AvgWage
        From Employees
        Group By Department
        ) As Z
Where AvgWage = (
                Select Max(Z1.AvgWage)
                From    (
                        Select Department, Avg(Wage) AvgWage
                        From Employees
                        Group By Department
                        )  Z1
                )

С CTE вы можете сделать:

With AvgWages As
    (
    Select Department
        , Avg(Wage) AvgWage
        , Rank() Over( Order By Avg(Wage) Desc ) WageRank
    From Employees
    Group By Department
    )
Select Department, AvgWage, WageRank
From AvgWages
Where WageRank = 1
3 голосов
/ 13 марта 2010

делает эту работу:

select *
from
(
  SELECT 
      department
      , avg(wage) as ave_wage
  FROM employees 
  GROUP BY department
)x 
order by ave_wage desc 
where rownum < 2;

(отказ от ответственности: полностью не проверен, поэтому я, возможно, положил бит rownum в неправильное место)

1 голос
/ 27 ноября 2013

Хотя приведенные ниже запросы показывают тот же результат, что и другие ответы, приятно показать пользователям, как это можно сделать в качестве альтернативы:

--Method 1 (Davek's select of 1st row over Order by) Brilliant!
--Method 2 (Thomas' where = sub-query result)
--Method 3 (Thomas' based on ranking)

--Method 4 (Inner join sub-queries)
select distinct a.department, a.wage from 
         (select distinct department, AVG(wage) as wage from employees group by department) as a
   inner join 
         (select Max(wage) as wage from
                (select distinct department, AVG(wage) as wage from employees group by department) as x) as b
   on a.wage = b.wage 
where a.wage = b.wage 

--Method 5 (AVG wage in (sub-query))
select distinct a.department, a.wage
from (select distinct department, AVG(wage) as wage from employees group by department) as a
Where a.wage in 
    (select Max(wage) as wage from
        (select distinct department, AVG(wage) as wage from employees group by department) as x)

Ожидая увидеть пользовательскую функцию для этого выбора также:)

0 голосов
/ 13 марта 2010

По Google ...

Причина: список SELECT не может включать в себя как групповую функцию, такую ​​как AVG, COUNT, MAX, MIN, SUM, STDDEV или VARIANCE, так и выражение отдельного столбца, если только выражение отдельного столбца не включено в предложение GROUP BY .

Действие: Удалите либо групповую функцию, либо выражение отдельного столбца из списка SELECT, либо добавьте предложение GROUP BY, которое включает все перечисленные выражения отдельных столбцов.

...