Вы можете использовать analytical function
и GROUP BY
следующим образом:
SELECT D.deptno,
COUNT(1) TOTAL_EMPS,
MAX(sal) AS MAX_SAL,
MIN(sal) AS MIN_SAL,
SUM(CASE WHEN SAL = MINSAL THEN 1 END) EMP_MIN_SAL,
SUM(CASE WHEN SAL = MAXSAL THEN 1 END) EMP_MAX_SAL,
MAX(CASE WHEN RNMIN = 1 THEN E.empno END) EMP_WITH_MIN_sAL,
MAX(CASE WHEN RNMAX = 1 THEN E.empno END) EMP_WITH_MAX_sAL,
LISTAGG(E.ename, ',') WITHIN GROUP (ORDER BY E.EMPNO) ALL_EMPS
FROM dept D JOIN (SELECT T.*,
MIN(SAL) OVER (PARTITION BY deptno) MINSAL,
MAX(SAL) OVER (PARTITION BY deptno) MAXSAL,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY SAL) RNMIN,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY SAL DESC) RNMAX
FROM emp T) E
ON E.deptno = D.deptno
GROUP BY D.deptno;
SQLFiddle demo