в выборке данных oracle, дело с проблемой минимальной заработной платы на группу (при наличии дубликатов) - PullRequest
0 голосов
/ 25 апреля 2020

emp

empno   ename   job         mgr     hiredate    sal    comm   deptno
7369    SMITH   CLERK       7902    80/12/17    800     null   20
7499    ALLEN   SALESMAN    7698    81/02/20    1600    300    30
7521    WARD    SALESMAN    7698    81/02/22    1250    500    30
7566    JONES   MANAGER     7839    81/04/02    2975    null   20
7654    MARTIN  SALESMAN    7698    81/09/28    1250    1400   30
7698    BLAKE   MANAGER     7839    81/05/01    2850    null   30
7782    CLARK   MANAGER     7839    81/06/09    2450    null   10
7788    SCOTT   ANALYST     7566    82/12/09    3000    null   20
7839    KING    PRESIDENT   null    81/11/17    5000    null   10
7844    TURNER  SALESMAN    7698    81/09/08    1500    null   30
7876    ADAMS   CLERK       7788    83/01/12    1100    null   20
7900    JAMES   CLERK       7698    81/12/03    950     null   30
7902    FORD    ANALYST     7566    81/12/03    3000    null   20
7934    MILLER  CLERK       7782    82/01/23    1300    null   10

Каждый менеджер должен найти сотрудника с наименьшей зарплатой среди других сотрудников. Тем не менее, минимальная годовая зарплата составляет более 1000.

Я пытался

select e.ename, e.sal, e.mgr
from (select ename, sal, mgr from emp where sal > 1000) e
where (e.sal, mgr) in (select min(sal), mgr from emp group by mgr) and mgr is not null
order by sal desc;

, и это приводит к

ename   sal     mgr
SCOTT   3000    7566
FORD    3000    7566
CLARK   2450    7839
MILLER  1300    7782
ADAMS   1100    7788

Как видите, среди сотрудников с 7698 менеджеров, зарплата должна быть больше 1000, но минимум меньше 1000, поэтому она исключается при выполнении с моим кодом.

результат, который я хочу

ename   sal     mgr
SCOTT   3000    7566
FORD    3000    7566
CLARK   2450    7839
MILLER  1300    7782
WARD    1250    7698
MARTIN  1250    7698
ADAMS   1100    7788

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

Что я должен изменить в коде?

* в моей версии oracle -> oracle 11g

1 Ответ

1 голос
/ 25 апреля 2020
select ename, sal, mgr from emp 
where (sal, mgr) in (
  select min(case when sal >= 1000 then sal end), mgr 
  from emp group by mgr
) 
and mgr is not null
order by sal desc;

Агрегатная функция MIN () может принимать выражения CASE. Здесь мы обнуляем любые значения, меньшие 1000. MIN () будет возвращать наименьшее NON-NULL значение, если есть хотя бы одно значение 1000 или выше для данной группы.

Вы можете также выполните следующую функцию MIN () analyti c.

select * from (
  select emp.*, min(case when sal >= 1000 then sal end) over (partition by mgr) mn 
  from emp
)
where mgr is not null and sal = mn
order by sal desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...