Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 4.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
84 Кб
Скачать
☆
  1. Для нахождения 5 сотрудников с максимальной зарплатой выполните запрос:

select *

from

(

select first_name||' '|| last_name name,job.job_name, round(salary,0) salary,

rank() over (order by salary desc) salary_rank from employee emp inner join job on emp.job_id=job.job_id

) t

where t.salary_rank<=5

rank() over (order by salary desc) – аналитическая функция, вычисляющая ранг записи исходя из значения поля salary. Desc позволяет отсортировать записи по убыванию, от максимальной к минимальной зарплате.

Для нахождения 5 сотрудников с минимальной зарплатой требуется изменить порядок сортировки на asc rank() over (order by salary asc) выполните запрос:

select *

from

(

select first_name||' '|| last_name name,job.job_name, round(salary,0) salary,

rank() over (order by salary asc) salary_rank from employee emp inner join job on emp.job_id=job.job_id

) t

where t.salary_rank<=5

  1. Соединим таблицу employee с таблицей department, которую соединим с location и при пощи функции rank() с группировкой данных по номеру отделов (partition by emp.department_id) получим итоговые данные. Выполните запрос :

select first_name||' '|| last_name name,job.job_name,dept.name as "Отдел",loc.loc_name, round(salary,0) salary,

rank() over (partition by emp.department_id order by salary desc) salary_rank from employee emp inner join job on emp.job_id=job.job_id

inner join department dept on emp.department_id=dept.department_id inner join location loc on dept.location_id=loc.location_id

Для вывода всех данных, требуется увеличить число строк для вывода.

  1. Выполните запрос:

SELECT manager_id, last_name, hire_date, COUNT(*) OVER (PARTITION BY manager_id ORDER BY hire_date RANGE NUMTODSINTERVAL(30, 'DAY') PRECEDING) AS t_count

FROM employee WHERE manager_id is NOT NULL;

Для задания интервала в запросе используется опция «RANGE NUMTODSINTERVAL(100, 'DAY') PRECEDING». Здесь «RANGE» диапазон, NUMTODSINTERVAL(30, 'DAY') – интервал в 30 дней, «preceding» означает разницу даты приема на работу (HIRE_DATE – в нашем запросе) очередного извлекаемого запросом сотрудника с датой первого принятого в этом временном интервале на работу сотрудника (в группе сотрудников под управлением «своего» менеджера – ведь мы используем «PARTITION BY manager_id»). Если в группе сотрудников, подчиненных одному менеджеру, дата приема на работу очередного извлекаемого запросом сотрудника отличается от даты первого принятого на работу под управлением этого менеджера сотрудника более, чем на тридцать дней, отсчет количества принятых на работу сотрудников вновь начинается с единицы.

  1. Выполните запрос:

SELECT dept.name "Отдел", job.job_name "Должность", SUM(salary) AS "Зарплата итого" FROM employee emp

,department dept,job

where emp.department_id=dept.department_id

and emp.job_id=job.job_id

GROUP BY ROLLUP (dept.name,job.job_name);

ROLLUP обеспечивает агрегирование на каждом уровне, заданном столбцами в GROUP BY. Это приводит к получению полной информации. Этот запрос извлекает не только название отдела, должность, сгруппированные по этим двум столбцам суммы зарплат, но также и промежуточные итоги общую сумму зарплаты по отделам.

  1. В дополнение к групповым подитогам и общим итогам, CUBE автоматически вычисляет все возможные комбинации возможных подитогов. Выведем столбцы: отдела, должность, суммарная зарплата, а также идентификаторы группирования по этим столбцам. Выполните запрос:

SELECT dept.name "Отдел",job.job_name "Должность", SUM(salary), GROUPING(dept.name), GROUPING(job.job_name ) FROM employee emp,

department dept,job

where emp.department_id=dept.department_id

and emp.job_id=job.job_id

GROUP BY CUBE(dept.name,job.job_name );

Наличие «1» в столбце grouping(dept.name) означает, что группирование проводится по номерам отделов – сумма зарплаты подсчитывается и выводится для строк с одинаковым номером отдела, «1» в столбце grouping(job.job_name) – по коду работы. Если в обоих столбцах значения «0», подсчитывается сумма по зарплате для этого кода работы и номера отдела.