"линия слияния" в оракуле - PullRequest
0 голосов
/ 02 февраля 2012

Я пытаюсь выполнить «объединение строк» ​​в Oracle, т. Е. Я хочу получить запрос, который возвращает строки, и каждая из этих строк имеет для каждого столбца значения, которые изначально были сохранены в других строках.

Например (я следую документации ), скажем, у меня есть таблица сотрудников EMP, в которой хранится номер сотрудника, номер его отдела и его зарплата

Как мне создать запрос, который возвращает столько строк, сколько отделов, а также максимальную зарплату в этом отделе?

Я хочу что-то вроде этого:

 EMPNO     DEPTNO        SAL MAX_VAL_IN_DEPT
---------- ---------- ---------- -----------------
  7934         10       1300              1300
  7369         20        800               800
  7900         30        950               950

Этот запрос :

SELECT empno
     , deptno
     , sal
     , FIRST_VALUE(sal IGNORE NULLS) OVER (PARTITION BY deptno ORDER BY sal ASC NULLS LAST) AS first_val_in_dept
FROM   emp;

- самое близкое, что я мог найти, но мне понадобится дополнительное предложение GROUP BY deptno, которое я не могу добавить.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Может быть что-то вроде (не проверено):

select 
e.empno,
e.deptno,
e.sal,
d.max_sal
from emp e,
(
select deptno, max(sal) as max_sal
from dept
group by deptno
) d
where e.deptno = d.deptno
;
2 голосов
/ 02 февраля 2012

Это будет быстрее, чем версия с отдельным суб-выбором.

Ваше утверждение было близко, вам просто нужно использовать max():

select empno,  
       deptno,
       sal,
       max(sal) over (partition by deptno) as MAX_VAL_IN_DEPT
from emp 

Не уверен насчет вашего" столько строк, сколько отделов ".Ваш пример выходных данных ясно показывает одну «строку» на сотрудника, а не на отдел.

2 голосов
/ 02 февраля 2012

Сделай так:

SELECT e.empno
     , e.deptno
     , e.sal
     , e2.maxsal AS MAX_VAL_IN_DEPT
FROM   emp e
INNER JOIN (select t.deptno, max(sal) as maxsal from emp t group by t.deptno) e2 on e.deptno = e2.deptno;
...