2016-04-04 2 views
0

У меня есть EMPLOYEES таблица:SQL заказа по группе с помощью запроса

employee_id(1) hire_date(15-2-2001) 
employee_id(2) hire_date(2-2-1999) 
employee_id(3) hire_date(11-2-2003) 
employee_id(4) hire_date(6-7-2001) 

Я хочу, чтобы отобразить год с наибольшим числом работников, нанятых в, с числом сотрудников на работу каждый месяц. Я попытался это:

select extract (year from hire_date) 
from employees 
where max(count(employee_id))=count(employee_id) 
order by extract (year from hire_date); 

и я получаю сообщение «ORA-00934: функциональная группа не имеет права здесь»

Что я делаю неправильно?

Я использую ORACLE 10g Express.

+0

_What я делаю неправильно _ Вы используете 2 агрегатные функции в файле 'where' положение?. –

ответ

2

Идея состоит в том, что вы можете использовать функции агрегации и окна для получения итогов по месяцам и годам. Затем вы можете выбрать самый большой, используя row_number() или dense_rank().

select ym.* 
from (select ym.*, dense_rank() over (order by year_cnt, year) as seqnum 
     from (select extract(year from hire_date) as yyyy, 
        extract(month from hire_date) as mm, 
        count(*) as cnt, 
        sum(count(*)) over (partition by extract(year from hire_date)) as year_cnt 
      from employees 
      group by extract(year from hire_date), 
        extract(month from hire_date) 
      ) ym 
    ) ym 
where seqnum = 1 
order by yyyy, mm; 

Хммм, вы можете сделать это без так много подзапросов:

with ym as (
     select extract(year from hire_date) as yyyy 
      extract(month from hire_date) as mm, 
      count(*) as cnt, 
      sum(count(*)) over (partition by extract(year from hire_date)) as yearcnt 
     from employees 
     group by extract(year from hire_date), extract(month from hire_date) 
    ) 
select * 
from ym 
where yearcnt = (select max(yearcnt) from ym) 
order by yyyy, mm; 

Конечно, это возвращает несколько лет, если два года имеют одинаковое максимальное значение.

0

С PL/SQL я нашел это:

declare  
    recuperation float; 
    CURSOR newRequest(recuperationDonnes float) is select count(employee_id) as nombreEmployes, 
     extract(month from hire_date) as mois from employees where 
     extract(year from hire_date) = (recuperationDonnes) group by extract(month from hire_date); 
    a float; 
    a1 float; 
begin 
    select extract (year from hire_date) as annee into recuperation from employees having count 
    (employee_id) >= all (select count (employee_id) as emp from employees group by extract(year 
    from hire_date)) group by extract(year from hire_date); 
    OPEN newRequest(recuperation); 
    LOOP 
     FETCH newRequest into a,a1; 
     Exit when newRequest%NotFound; 
     dbms_output.put_Line('Year: '||recuperation||' mois: '||a1||' nombreEmployes: '||a); 
    END LOOP ; 
    CLOSE newRequest; 
end; 
+0

Никогда не делайте в PL/SQL то, что вы можете сделать (легко!) В простом SQL. – mathguy

Смежные вопросы