Есть ли способ объединить две таблицы, а затем сгруппировать по некоторому атрибуту - PullRequest
1 голос
/ 19 апреля 2019

Здравствуйте, у меня есть две таблицы Emp_774884 и Dept_774884.

Emp_774884 содержит

emp_id  ename  sal  deptid 

Dept_774884 Содержит

deptid dept_name no_of_emp city

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

select emp_774884.ename,Max(emp_774884.sal) as salary, dept_774884.DEPT_NAME
from emp_774884 join
      dept_774884
      on dept_774884.deptid = emp_774884.deptid
group by dept_774884.DEPT_NAME ;

Но я получаю следующий результат

ORA-00979: не выражение GROUP BY 00979. 00000 - «не выражение GROUP BY» * Причина:
* Действие:

Я ожидаю получить следующие столбцы, сгруппированные по названию их отдела

Имя зарплаты dept_name

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Запрос, что вы хотите

select e.ename,d.DEPT_NAME, Max(e.sal) as salary, d.DEPT_NAME
from emp_774884 e join dept_774884 d on ( e.deptid = d.deptid)
 join (select dept_774884.DEPT_NAME, Max(emp_774884.sal) as salary, dept_774884.DEPT_NAME
from emp_774884  e1 join
      dept_774884 d1
      on d1.deptid = e1.deptid
group by dept_774884.deptid) t on (e.deptid = t.deptid)

Теперь перейдем к делу. Почему вы получаете

ORA-00979: not a GROUP BY expression 00979. 00000 - "not a GROUP BY expression" *Cause:
*Action:

Таким образом, это исключение возникает, когда вы используете группу по исключению с некоторым столбцом, а во время выбора вы используете разные столбцы.

Другими словами

Вы можете выбрать только те столбцы, которые вы упомянули в группе.

Так что в вашем случае вы используете deptid как группу по столбцу, но вы также выбираете другой столбец.

0 голосов
/ 19 апреля 2019

Ошибка кажется довольно очевидной - у вас есть столбцы в select, которые не агрегированы, а не в group by. Простое добавление столбцов устраняет ошибку, но не делает то, что вы хотите.

Oracle имеет очень красивое расширение под названием keep, которое делает то, что вы хотите:

select d.DEPT_NAME, max(e.sal) as max_salary,
       max(e.ename) keep (dense_rank first order by e.sal desc) as ename_at_max
from emp_774884 e join
     dept_774884 d
     on d.deptid = e.deptid
group by d.DEPT_NAME ;

Обратите внимание, что при наличии связей возвращается только одно имя сотрудника. Непонятно, что вы хотите в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...