Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Dopy_2012.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
124.26 Кб
Скачать
  1. В названии отдела вывести только второе слово, если название состоит из двух и более слов, иначе вывести первое слово.

SELECT department_name

FROM Departments;

SELECT CASE

WHEN INSTR(Dep_name,' ')>0

THEN SUBSTR(Dep_name, 1, INSTR(Dep_name,' ')-1)

ELSE Dep_name

END CASE

FROM (SELECT SUBSTR(department_name, INSTR(department_name, ' ' )+1) Dep_name

FROM Departments);

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

В результатах вывести:

  • название города

  • название департамента

  • средняя суммарная заработная плата в городе

  • суммарная зарплата в департаменте

SELECT town, summsal, avgsumsal, dep FROM

(SELECT town, AVG(sal) avgsumsal FROM

(SELECT d.department_name depn, l.city town, SUM(e.salary) sal

FROM employees e

INNER JOIN (departments d

INNER JOIN locations l

ON (d.location_id=l.location_id))

ON e.department_id=d.department_id

GROUP BY d.department_name, l.city)

GROUP BY town) s1

JOIN

(SELECT l.city city, d.department_name dep, SUM(e.salary) summsal

FROM employees e

INNER JOIN (departments d

INNER JOIN locations l

ON (d.location_id=l.location_id))

ON e.department_id = d.department_id

GROUP BY l.city, d.department_name) s2

ON s1.town = s2.city

WHERE summsal > avgsumsal;

  1. Отобразить все связи по внешнему ключу между таблицами схемы наряду с количеством пользователей, имеющих привилегии на удаление строк из главной таблицы, и правило удаления строк из дочерней таблицы при удалении строк главной.

Результат должен содержать 4 столбца:

  • название дочерней таблицы, соединенное через точку с названием столбца внешнего ключа дочерней таблицы;

  • название главной таблицы, соединенное через точку с названием столбца первичного ключа главной таблицы;

  • количество пользователей, имеющих привилегии на удаление строк из главной таблицы;

  • правило удаления строк.

SELECT ch_cons.TABLE_NAME || '.' || ch_detail.column_name AS "Child Table Name",

ch_cons.delete_rule AS "Delete Rule",

pr_cons.TABLE_NAME || '.' || pr_detail.column_name AS "Parent Table Name", COUNT(grantee), privilege

FROM user_constraints ch_cons JOIN user_cons_columns ch_detail ON ch_cons.constraint_name = ch_detail.constraint_name

AND ch_cons.TABLE_NAME = ch_detail.TABLE_NAME JOIN user_constraints pr_cons ON pr_cons.constraint_name = ch_cons.r_constraint_name

JOIN user_cons_columns pr_detail ON pr_detail.constraint_name = pr_cons.constraint_name

AND pr_detail.TABLE_NAME = pr_cons.TABLE_NAME JOIN user_tab_privs us_privs ON us_privs.TABLE_NAME = pr_detail.TABLE_NAME

WHERE privilege = 'DELETE'

GROUP BY ch_cons.TABLE_NAME || '.' || ch_detail.column_name, ch_cons.delete_rule, pr_cons.TABLE_NAME || '.' || pr_detail.column_name, privilege;

  1. Написать запрос, выдающий отчёт о суммарных выплатах сотрудникам, непосредственно подчиняющихся заданному руководителю по идентификаторам должностей (поле Job_id). Непосредственное подчинение предполагает подчинение на первом уровне. Номер руководителя может встречаться в отчете лишь дважды.

Номер руководителя

Должность

Кол-во сотрудников

Выплаты

Вид выплаты

       100

AD_VP

2

34000

Зарплата сотрудников в должности AD_VP

      

MK_MAN

1

13000   

Зарплата сотрудников в должности MK_MAN

PU_MAN

1

11000   

Зарплата сотрудников в должности PU_MAN

SA_MAN

5

79650   

Зарплата сотрудников в должности SA_MAN

      

ST_MAN

5

36400   .

Зарплата сотрудников в должности ST_MAN

       100          

14

174050

Суммарная зарплата у руководителя 100

       101

AC_MGR

1

12000

Зарплата сотрудников в должности AC_MGR

FI_MGR

1

12000  

Зарплата сотрудников в должности FI_MGR

HR_REP

1

6500   

Зарплата сотрудников в должности HR_REP

PR_REP

1

10000  

Зарплата сотрудников в должности PR_REP

AD_ASST

1

4400   

Зарплата сотрудников в должности AD_ASST

       101         

5

44900

Суммарная зарплата у руководителя 100

       

 

34

301250

Общий итог

WITH report AS

-- Выводим все нужные столбцы и два grouping столбца для определения итоговых строк

(SELECT manager_id, job_id, emp_count, sum_sal, mng_group, job_group, ROWNUM rn

FROM (SELECT manager_id, job_id, COUNT(*) emp_count, SUM(salary) sum_sal,

GROUPING(manager_id) mng_group, GROUPING(job_id) job_group

FROM employees

GROUP BY ROLLUP(manager_id, job_id)

ORDER BY manager_id)),

-- Определяем номер первой строки вхождения для каждого менеджера

-- (менеджер и первый ROWNUM, который ему соответствует)

mng_row1 AS (SELECT manager_id, MIN(rn) min_rn

FROM report

GROUP BY manager_id)

-- Выводим номера руководителей только в первой и в итоговой строке

SELECT

CASE job_group WHEN 1 THEN TO_CHAR(manager_id) ELSE

CASE rn WHEN min_rn THEN TO_CHAR(manager_id) ELSE ' '

END END AS "Номер руководителя",

NVL(job_id, ' ') "Должность",

emp_count "Количество сотрудников",

sum_sal "Выплаты",

-- Выводим столбец "Вид выплаты" в зависимости от значения GROUPING

CASE mng_group WHEN 1 THEN 'Общийитог' ELSE

CASE job_group WHEN 1 THEN 'Суммарная зарплата у руководителя ' || manager_id

ELSE 'Зарплата сотрудников в должности ' || job_id

END END AS "Видвыплаты"

FROM report LEFT JOIN mng_row1 USING(manager_id)

ORDER BY manager_id, job_id;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]