Отображение статистики из таблиц emp и dept в одном запросе - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть две таблицы emp и dept

Таблица emp имеет следующие поля:

EMPNO   ENAME   JOB MGR HIREDATE    SAL COMM    DEPTNO

Таблица Dept имеет следующие поля:

DEPTNO  DNAME   LOC

Правила таковы: - а. общее количество сотрудников в каждом отделе б. самая высокая зарплата каждого отдела c. Наименьшая зарплата каждого отдела. д. Количество сотрудников с самой высокой зарплатой в каждом отделе. е. Количество сотрудников с наименьшей зарплатой в каждом отделе. е. имя / идентификатор сотрудника с самой высокой зарплатой в каждом отделе. г. имя / идентификатор сотрудника с наименьшей зарплатой в каждом отделе. час Имена всех сотрудников, принадлежащих к каждому отделу.

o / p выглядит следующим образом: enter image description here

для данных таблицы emp и dept обратитесь по этой ссылке

http://sqlfiddle.com/#! 4 / 1bc2b8

Заранее спасибо ..

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы можете использовать 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

0 голосов
/ 20 апреля 2020

Использование aggregate functions и group by .... без использования analytical functions

Select deptno,
    COUNT(*) tot_emps,
    MAX(sal) max_sal,
    MIN(sal) min_sal,
    COUNT(sal) KEEP (DENSE_RANK FIRST ORDER BY sal desc) emp_max_salary,
    COUNT(sal) KEEP (DENSE_RANK FIRST ORDER BY sal asc) emp_min_salary,
    MAX(empno || '-' || ename)  KEEP (DENSE_RANK FIRST ORDER BY sal DESC) emp_with_max_salary,
    MIN(empno || '-' || ename)  KEEP (DENSE_RANK FIRST ORDER BY sal ASC)emp_with_min_salary,
    LISTAGG(ename,',') WITHIN GROUP (ORDER BY ename) emp_list
FROM emp
    GROUP BY deptno
    ORDER BY deptno;

SQLFiddle_Demo

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