---
title: Решения
---
<style>
body{overflow-x:hidden;color:#312928;background:#f5f3ed url(https://i.imgur.com/B8wy02N.png) top left repeat}:root{--color-primary:#004d40;--color-primary-dark:#1c1c1e;--color-primary-darker:#111;--color-primary-light:#39796b;--color-secondary:#00838f;--color-secondary-dark:#005662;--color-secondary-light:#4fb3bf;--color-accent:#9d76ff;--border-color:#080808;--text-color-light:#8effff;--text-color-bright:#fff;--text-color-dark:#333}#doc{display:block;width:100%;margin:31px auto 31px;background:#f5f3ed url(https://i.imgur.com/S2fW9vg.jpg) top left repeat;border-image-width:100px;border:32px solid;border-image:url(https://i.imgur.com/XzF7kg2.png) 38 round round}.tool-bar>a.fa{color:var(--color-primary-light) !important;border:none}.tool-bar>a.fa:hover{color:var(--text-color-bright) !important}.ui-infobar__user-info>ul>li>div>.flex>span{color:var(--text-color-light) !important}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:500;text-align:left;border:none;text-align:center;font-size:80px;color:#424242;font-family:cursive}
.markdown-body h1,.markdown-body h2{text-align:center}}.markdown-body h2{border-bottom:1px solid var(--color-secondary)}.markdown-body h1{font-size:3.7em;text-align:center}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.4em}.markdown-body h4{font-size:1.3em}.markdown-body h5{font-size:1.2em}.markdown-body h6{font-size:.8em}.markdown-body hr{background-color:var(--color-secondary);margin:1.25em 0;height:1.1px}.markdown-body blockquote,.markdown-body blockquote blockquote{border-left-color:var(--color-secondary);color:#999;padding:0 !important;padding-right:5em !important}.markdown-body blockquote:before{color:var(--color-secondary)}.markdown-body blockquote small,.markdown-body blockquote i.fa{color:var(--color-accent);opacity:.8}.markdown-body table{display:table;padding:1em;margin-left:1em;width:calc(100% - 2em)}.markdown-body table th,.markdown-body table td,.markdown-body table tr{border:none !important}.markdown-body table tr{background-color:transparent !important;border-bottom:1px solid rgba(255,255,255,.3) !important}
.markdown-body .sequence-diagram rect[stroke=none](/null){fill:#000;opacity:.2;filter:invert(1)}.markdown-body .graphviz polygon{fill:transparent}.markdown-body .vega svg{background-color:transparent !important}.markdown-body .fretboard .svg_wrapper{background-color:transparent}.markdown-body .alert{color:#fff;position:relative;z-index:1;padding:0;border:none;font-weight:500}.markdown-body p{padding:0 1em}.markdown-body .alert-success:before,.markdown-body .alert-info:before,.markdown-body .alert-warning:before,.markdown-body .alert-danger:before{content:' ';position:absolute;z-index:-1;width:100%;height:100%}
h1:after,h2:after,h3:after,h4:after,h3.md-focus:before,h4.md-focus:before,h3.md-focus:after,h4.md-focus:after{content:'';display:block;background-repeat:no-repeat;background-position:top center;background-size:auto 80%;width:100%;z-index:1;margin:0;padding:20px 30px;border:0}h1:after,h2:after,h3:after,h4:after{background-image:url("https://lh3.googleusercontent.com/wJsGW_MA3V4aC2clzv0Z0OAVWwdXE11CFoA2LjG-1AavRukDFaCBQU5HqJKe9oi57buAMrsCEkd9XJeIBfGjP4h7HzOKhIjANL94EnNrD8GADHG7I-3GFLdHVq_bF1DJSYCPj9tu5CPzv4Lb4an0Ef93_CRbZ--6QyqFrNWzHz5XL-iRrzbrrA")}table{width:550px;margin:24px auto;border-collapse:separate;border-spacing:4px}tr:nth-child(odd){background-color:#f0f8ff}tr:nth-child(even){background-color:#ffb6c1}td{vertical-align:top;padding:8px 16px}td:first-child{text-align:center}td:not(:first-child){text-align:left}:root{--black:#111;--white:#f2f2f2;--grey:#ccc;--blue:#03a9f4;--border-radius:10px;--box-shadow:0px 3px 6px rgba(0,0,0,.25)}.list{ z-index: -1; margin:0;padding:0;padding-bottom:5px;box-sizing:border-box;position:relative;padding-top: 10px;background:#eae7df;width:80%;border-radius:var(--border-radius);box-shadow:var(--box-shadow);margin:1.5rem;& h2{background:var(--blue);color:var(--white);padding:1rem 2rem;border-radius:var(--border-radius) var(--border-radius) 0 0}
& tbody{position:relative;padding:2em;& tr{position:relative;list-style:none;padding:1rem 0;border-bottom:1px solid rgba(0,0,0,.1);&:last-child{border-bottom:none}}}}.hoverTable{ list-style:none;margin:0;padding:0;margin:0 10px -8px -20px;padding-top: 70px;}.hoverTable a{background:##f4f3ee;color: #312928;border-radius:3px;box-shadow:1px solid red}.hoverTable li{background:#efeee9eb !important; margin: 10px;
border: 1px solid #b9ab9e;}.hoverTable li:hover{background-color:white;!important}
#doc pre{background-color:#f4f3ee !important}.ui-infobar{margin:0;max-width:none;width:100%;height:80px;display:flex;justify-content:flex-end;align-items:center;box-shadow:0 1px 10px rgb(0 0 0/20%),0 1px 1px rgb(0 0 0/20%);box-sizing:border-box;margin-bottom:100px;position:relative;background:#f5f3ed url(https://i.imgur.com/D3JHgvv.png) top left repeat}.ui-infobar:after{content:'';position:absolute;z-index:-1;bottom:-300px;display:block;width:100%;height:300px;background:url(https://i.imgur.com/kZDzETE.png) no-repeat,url(https://i.imgur.com/visfeOY.png) repeat-x}#doc,.toc{z-index:100;!important}.container-fluid{padding-right:0;padding-left:15px;margin-right:auto;margin-left:auto}#ui-toc-affix{z-index:1000;font-size:1.2em}.ui-comment-app{right:100px!important;top:100px}.ui-toc-dropdown .nav>li>a{font-size:25px}.ui-comment-container{margin-left:55px !important}.ribbon-container{background:0 0 !important;position:relative;z-index:1;top:-30px}.ribbon{background:#f6a655 url(http://portfolio.queenofwhisks.com/demo/overlay/noise.png);box-shadow:2px 6px 12px rgba(0,0,0,.5);font-family:Charter,serif;font-size:16px;line-height:1;text-align:center;margin:0 auto;padding:.25em 0;position:relative;width:86%;top:80px}
.ribbon:before,.ribbon:after{border:1.5em solid #ee9e4f;content:'';display:block;position:absolute;bottom:-1em;z-index:-1}.ribbon:before{left:-2em;border-right-width:1.5em;border-left-color:transparent;box-shadow:2px 2px 2px rgba(0,0,0,.5)}.ribbon:after{right:-2em;border-left-width:1.5em;border-right-color:transparent;box-shadow:-2px 2px 2px rgba(0,0,0,.5)}.ribbon-content{border-top:.0625em dashed #d5700b;border-bottom:.0625em dashed #d5700b;box-shadow:inset 0px 1px 1px rgba(0,0,0,.08),inset 0px -1px 1px rgba(255,255,255,.08),0px -1px 1px rgba(255,255,255,.2),0px 1px 1px rgba(0,0,0,.08);display:block;padding:.6875em 0}.ribbon-content:before,.ribbon-content:after{content:'';display:block;position:absolute;border-style:solid;border-color:#b86614 transparent transparent;bottom:-1em}.ribbon-content:before{left:0;border-width:1em 0 0 1em}.ribbon-content:after{right:0;border-width:1em 1em 0 0}.ribbon a{color:#c2660a;text-decoration:none;text-shadow:1px 1px 1px rgba(255,255,255,.25)}
</style>
## Selecting HR Schema Using Oracle Live SQL
<center>
<iframe width="100%" height="420" src="https://www.youtube.com/embed/TXp9b-RpIbw" title="Selecting HR Schema Using Oracle Live SQL" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</center>
<br>
<br>
<center><img src="https://i.imgur.com/9fMgT3O.jpg" alt="Иллюстрация решения 116 задачи." width="90%" height="auto" /><br>
<i>Иллюстрация решения 116 задачи.</i></center>
<br>
<br>
<center><img src="https://i.imgur.com/Wl5GyoU.jpg" alt="Иллюстрация решения 202 задачи." width="90%" height="auto" /><br>
<i>Иллюстрация решения 202 задачи.</i></center>
<br>
<br>
# Solutions
<center>
<div class="ribbon-container">
<div class="ribbon">
<a class="ribbon-content">ToDo List</a>
</div>
<div class="list">
<ul class="nav hoverTable">
<li>
<a href="#80">
80
Помечтаем о зарплате
</a>
</li>
<li>
<a href="#82">
82
Зарплата через 6 месяцев работы
</a>
</li>
<li>
<a href="#83">
83
День найма
</a>
</li>
<li>
<a href="#85">
85
Служащие и их оклад
</a>
</li>
<li>
<a href="#111">
111
Подразделения компании
</a>
</li>
<li>
<a href="#116">
116
Сотрудники и их стаж работы
</a>
</li>
<li>
<a href="#204">
204
Самые ценные
</a>
</li>
<li>
<a href="#207">
207
Кто полетит на Мальдивы летом?
</a>
</li>
<li>
<a href="#208">
208
Загадка числа «3»
</a>
</li>
<li>
<a href="#82">
301
Назад в прошлое
</a>
</li>
</ul>
</div>
</div>
</center>
# 6
В некоторой Системе существует таблица LOCKS с двумя столбцами - Locker и Locked, каждая запись в которой связывает 2 объекта - заблокированного (Locked) и того, кто его заблокировал (Locker). Необходимо отобразить SQL-запросом иерархию заблокированных объектов, включая те объекты, которые являются причинами всех блокировок. Уровни иерархии выделять отступами от левого края состоящими из пробелов - по одному на каждый новый уровень.
Пример:
LOCKS
| Column 1 | Column 2 |
| -------- | -------- |
|A| B|
|A| C|
|B| D|
|D| E|
|C| F|
|C| J|
|C| H|
| Надо вывести: |
| -------- |
A
B
D
E
C
F
H
J
Сдвиг - один пробел
```sql
WITH t AS
(
SELECT Locker
,rownum r
FROM
(
SELECT Locker
FROM LOCKS
UNION
SELECT Locked
FROM LOCKS
)
)
SELECT lpad(Locker ,length(Locker ) + level -1,' ') rez
FROM
(
SELECT distinct t1.Locker
,t1.r id
,t2.r -- построение таблицы для последующей иерархии
FROM t t1
LEFT JOIN LOCKS
ON t1.Locker = LOCKS.Locked
LEFT JOIN t t2
ON t2.Locker = LOCKS.Locker
) START
WITH r IS NULL CONNECT BY PRIOR id = r ORDER SIBLINGS BY Locker
```
# 7
Используя таблицы REGIONS, COUNTRIES, LOCATIONS, DEPARTMENTS, построить (показать) иерархию объектов "Регион – Страна – Местоположение – Подразделение" для региона name = ' Americas '.
Иерархия должна быть построена (показана) одной командой SELECT.
В результате вывести:
- номер уровня, на котором находится в иерархии данный объект (LEVEL),
- имя объекта, дополненное слева (LEVEL -1)*3 пробелами.
Объекты одного уровня должны быть отсортированы по именам.
Пример результата:
|Уровень| Единица|
-- | --
|1 | Europe|
|2 | Belgium|
|2 | Denmark|
|2 | France|
|2 | Germany|
|3 | Munich|
|4 | Public Relations|
|2 | Italy|
|3 | Roma|
|3 | Venice|
|2 | Netherlands|
- Решение с использованием иерархического запроса, операций над множествами и вложенного запроса
```sql
SELECT LEVEL
,LPAD(' ',(LEVEL-1)*3) || name
FROM
(
SELECT 'REG_' || region_id id
,region_name name
,NULL pid
FROM regions r
WHERE region_name = 'Americas'
UNION ALL
SELECT 'COU_' || country_id id
,country_name name
,'REG_' || region_id pid
FROM countries c
UNION ALL
SELECT 'LOC_' || location_id id
,city name
,'COU_' || country_id pid
FROM locations l
UNION ALL
SELECT 'DEP_' || department_id id
,department_name name
,'LOC_' || location_id pid
FROM departments d
)
START WITH pid IS NULL
CONNECT BY PRIOR id = pid
ORDER SIBLINGS BY name
```
* Решение с использованием иерархического запроса, операций над множествами и вложенного запроса
```sql
SELECT LEVEL, LPAD(' ', (LEVEL-1)* 3) || name FROM
(
SELECT 'REG_' || region_id id, region_name name, NULL pid FROM regions r WHERE region_name = 'Americas'
UNION ALL
SELECT 'COU_' || country_id id, country_name name, 'REG_' || region_id pid FROM countries c
UNION ALL
SELECT 'LOC_' || location_id id, city name, 'COU_' || country_id pid FROM locations l
UNION ALL
SELECT 'DEP_' || department_id id, department_name name, 'LOC_' || location_id pid FROM departments d
)
START WITH pid IS NULL
CONNECT BY PRIOR id = pid
ORDER SIBLINGS BY name
```
# 16
Напишите запрос для вывода самого высокого, самого низкого, суммы всех окладов и среднего оклада по всем служащим. Назовите столбцы Maximum, Minimum, Sum и Average. Округлите ВСЁ до ближайшего целого.
```sql
SELECT MAX (salary) "Maximum"
,MIN (salary) "Minimum"
,SUM (salary) "Sum"
,ROUND (AVG (salary),0) "Average"
FROM employees
```
# 17
Отделу по работе с персоналом (Human Resources, HR) необходимы данные, включающие фамилию, код должности, дату найма и табельный номер для каждого служащего.
Табельный номер должен выводиться первым. Определите псевдоним STARTDATE для столбца HIRE_DATE. Отсортируйте данные по дате найма.
```sql
SELECT employee_id
,last_name
,job_id
,hire_date AS STARTDATE
FROM employees
ORDER BY hire_date
```
# 18
Создайте отчет, содержащий фамилию, должность и номер менеджера всех служащих, не имеющих менеджера или номер менеджера которых равен 121.
```sql
SELECT last_name
,job_id
,manager_id
FROM employees
WHERE manager_id IS NULL OR manager_id = 121
```
# 19
Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr. Отсортируйте данные по номеру менеджера.
```sql
SELECT e.last_name "Employee"
,e.employee_id "Emp#"
,m.last_name "Manager"
,m.employee_id "Mgr#"
FROM employees e, employees m
WHERE (e.manager_id = m.employee_id)
ORDER BY "Mgr#"
```
# 22
Напишите запрос для вывода фамилий и окладов служащих, зарплата которых строго больше 5000/$ и строго меньше 8000/$. Назовите выходной столбец SALARY. Длина столбца SALARY – 10 символов с дополненными слева символами $.
```sql
SELECT last_name
,LPAD(salary,10,'$') AS "SALARY"
FROM EMPLOYEES
WHERE (salary >= 5000)
AND (salary < 8000)
```
# 23
Отделу HR необходимы сведения о всех служащих, нанятых раньше своих менеджеров. Выведите фамилии и даты найма таких служащих, а также фамилии и даты найма их менеджеров . Назовите колонки e_lastname, e_hire_date, m_lastname, m_hire_date соответственно. Отсортируйте полученные данные по фамилии служащих.
```sql
SELECT t1.last_name AS "Employee"
,t1.hire_date AS "Date employee"
,t2.last_name AS "Manager"
,t2.hire_date AS "Date manager"
FROM employees t1
JOIN employees t2
ON t1.manager_id = t2.employee_id
WHERE t1.manager_id is not null
AND t1.hire_date < t2.hire_date
ORDER BY t1.last_name
```
# 24
Отделу по работе с персоналом (Human Resources, HR) необходим список номеров отделом, в которых нет сотрудников с идентификатором должности FI_ACCOUNT. Используйте операторы над множествами для создания отчета.
```sql
SELECT department_id FROM departments
MINUS
SELECT d.department_id
from employees e
,departments d
where (e.department_id = d.department_id) and not (e.job_id <> 'FI_ACCOUNT')
```
# 25
Отделу HR необходим отчет, в котором выводится следующее:
- фамилии и отделы всех сотрудников из таблицы EMPLOYEES, независимо от того, относятся ли они к какому-то отделу или нет;
- следом за ними номера и наименования всех отделов из таблицы DEPARTMENTS, независимо от того, есть ли в них сотрудники или нет. Для получения отчета используйте конструкцию UNION.
Названия колонок оставьте оригинальные (т.е. как в таблицах).
```sql
SELECT last_name
,department_id
,TO_CHAR (NULL) department_name
FROM employees
UNION
SELECT (NULL)
,department_id
,department_name
FROM departments
```
# 26
Сотрудникам отдела HR не нужны все данные таблицы EMPLOYEES. Включите номер служащего, фамилию служащего и номер отдела из таблицы EMPLOYEES. Смените заголовок столбца с фамилией служащего на EMPLOYEE.
```sql
SELECT employee_id
,last_name AS EMPLOYEE
,department_id
FROM employees
```
# 27
Выведите отделы и число сотрудников, половина чьей зарплаты
больше, чем средняя зарплата компании. Отделы в которых таких сотрудников нет, не выводить. Столбцы результата назвать соответственно "dept" и "Hi_Salary"Сотрудникам отдела HR не нужны все данные таблицы EMPLOYEES. Включите номер служащего, фамилию служащего и номер отдела из таблицы EMPLOYEES. Смените заголовок столбца с фамилией служащего на EMPLOYEE.
```sql
SELECT
departments.department_id "dept",
COUNT(salary) "Hi_Salary"
FROM
employees
JOIN departments ON employees.department_id = departments.department_id
WHERE
salary / 2 > (
SELECT
AVG(salary)
FROM
employees
)
GROUP BY
departments.department_ID
```
# 28
Команда SELECT содержит 4 ошибки. Исправьте их и выполните правильный запрос.
```sql
SELECT employee_id
,last_name
,(salary*12) "ANNUAL SALARY"
FROM employees
```
# 30
Вследствие проблем финансирования отделу HR необходим отчет, в котором показываются фамилии и оклады служащих, получающих более $13,000. Отсортируйте данные в порядке возрастания оклада.
```sql
SELECT last_name, salary
FROM employees
WHERE salary > 13000
ORDER BY salary
```
# 21
Создайте отчет для вывода фамилии, идентификатора должности и даты начала работы всех служащих, с фамилиями Matos и Taylor. Отсортируйте данные в порядке возрастания даты найма.Команда SELECT содержит 4 ошибки. Исправьте их и выполните правильный запрос.
```sql
SELECT
last_name,
job_id,
hire_date
FROM
employees
WHERE
last_name = 'Matos'
OR last_name = 'Taylor'
ORDER BY
hire_date ASC
```
# 32
Отделу HR необходим отчет, в котором выводятся фамилии и даты найма всех служащих, нанятых в 1987 г.
```sql
SELECT last_name
,hire_date
FROM employees
WHERE hire_date like '%87'
```
# 33
Создайте отчет для вывода фамилий, окладов и комиссионные всех служащих, зарабатывающих комиссионные.
Отсортируйте данные в порядке убывания окладов и возрастания комиссионных.
```sql
SELECT last_name
,salary
,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC, commission_pct
```
# 34
Выведите все фамилии служащих, в которых третья буква – a.
```sql
SELECT last_name
FROM employees
WHERE instr(last_name, 'a') = 3
```
# 35
Запросите фамилии, должности и оклады всех служащих, работающих торговыми представителя (SA_REP) или клерками на складе (ST_CLERK), у которых не может быть равен $2500, $3500 или $7000
```sql
SELECT last_name
,job_id
,salary
FROM employees
WHERE (job_id IN ('SA_REP', 'ST_CLERK'))
AND (salary NOT IN (2500, 3500, 7000))
```
# 36
Отделу HR требуется отчет, в котором приводится номер служащего, его фамилия, оклад и новый оклад, повышенный на 15% и округленный до целого. Столбец в отчете, содержащий новый оклад, должен иметь имя New Salary
```sql
SELECT
employee_id,
last_name,
salary,
TRUNC(salary + (salary * 15 / 100), 0) AS "New Salary"
FROM
employees
```
# 38
Используя функцию DECODE, напишите запрос для отображения должности сотрудника и ее разряда (grade). Разряд каждого типа должности JOB_ID приведен в таблице:
Должность Разряд
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
Другая 0
```sql
SELECT
JOB_ID "Должность",
decode(
JOB_ID,
'AD_PRES', 'A',
'ST_MAN', 'B',
'IT_PROG', 'C',
'SA_REP', 'D',
'ST_CLERK', 'E',
'0'
) G
FROM
EMPLOYEES
```
``` sql
SELECT
JOB_ID "Должность",
(
case
JOB_ID
when 'AD_PRES' THEN 'A'
when 'ST_MAN' THEN 'B'
when 'IT_PROG' THEN 'C'
when 'SA_REP' THEN 'D'
when 'ST_CLERK' THEN 'E'
ELSE '0'
END
) G
FROM
EMPLOYEES
```
# 39
Напишите запрос для вывода должности и количества служащих, занимающих каждую должность.
```sql
SELECT job_id, count(*)
FROM employees
GROUP by job_id
```
# 40
Одной командой SELECT выбрать сотрудников, для которых - в таблице истории занятия должностей зафиксированы переходы на другую должность и - в таблице истории занятия должностей отсутствуют сведения об их первой должности, которую они занимали при приеме на работу в компанию. В результат вывести: - идентификатор сотрудника, - фамилию сотрудника, - дата, когда сотрудник был принят на работу, - идентификатор должности, которую занимает сотрудник, - идентификатор подразделения, к которому в данный момент приписан сотрудник. Результат отсортировать по возрастанию по полям: - дата, когда сотрудник был принят на работу, - фамилия сотрудника.
```sql
SELECT
e.employee_id,
e.last_name,
e.hire_date,
e.job_id,
e.department_id
FROM
employees e
WHERE
e.hire_date < (
SELECT
MIN(j.start_date)
FROM
job_history j
WHERE
e.employee_id = j.employee_id
GROUP BY
employee_id
)
ORDER BY
e.hire_date,
e.last_name
```
# 43
Отделу HR необходим отчет, в котором выводятся фамилии и даты найма всех служащих, нанятых в 1990 г.
```sql
SELECT last_name
,hire_date
FROM employees
WHERE hire_date like '%90'
```
# 45
Напишите запрос для вывода должности и количества служащих, занимающих каждую должность. Отсортируйте данные по названию должности
```sql
SELECT job_id, count(*)
FROM employees e
GROUP by job_id
ORDER by job_id
```
# 46
Выведите все фамилии служащих, в которых есть буквы "a" и "y"
```sql
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '%a%'
AND last_name LIKE '%y%'
```
# 47
Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr
```sql
SELECT e.last_name "Employee"
,e.employee_id "Emp#"
,m.last_name "Manager"
,m.employee_id "Mgr#"
FROM employees e, employees m
WHERE (e.manager_id = m.employee_id)
```
# 48
Отделу HR необходим отчет, в котором выводятся фамилии, номера отделов и должности служащих, идентификатор местоположения отдела которых равен 1700.
```sql
SELECT
last_name,
department_id,
job_id
FROM
employees
WHERE
department_id IN (
SELECT
department_id
FROM
departments
WHERE
location_id = 1700
)
```
# 49
Отделу по работе с персоналом (Human Resources, HR) необходим список номеров отделов, в которых нет сотрудников с идентификатором должности ST_CLERK. Используйте операторы над множествами для создания отчета.
```sql
SELECT
department_id
FROM
departments
MINUS
SELECT
department_id
FROM
employees
WHERE
job_id like 'ST_CLERK'
```
# 50
Вывести фамилию сотрудника и рассчитать количество месяцев между
сегодня и датой его найма. Столбец c количеством месяцев назвать MONTHS_WORKED. Отсортировать данные по 2-му полю. Округлить до ближайшего целого.
```sql
SELECT
last_name,
ROUND(months_between (SYSDATE, hire_date)) month_worked
FROM
employees
ORDER BY
month_worked
```
# 51
Отделу HR необходим отчет, в котором выводится следующее: - фамилии и отделы всех сотрудников из таблицы EMPLOYEES, независимо от того, относятся ли они к какому-то отделу или нет; - номера и наименования всех отделов из таблицы DEPARTMENTS, независимо от того, есть ли в них сотрудники или нет.
Колонки отчета назвать "Last Name", "Dept Employye", "Dept Num", "Dept Name"
```sql
SELECT
e.last_name "Last Name",
e.department_id "Dept Employye",
d.department_id "Dept Num",
d.department_name "Dept Name"
FROM
employees e
CROSS JOIN departments d
```
# 53
Вывести названия колонок и тип данных для таблицы DEPARTMENTS.
```sql
SELECT column_name
,data_type
FROM all_tab_columns
WHERE table_name = 'DEPARTMENTS'
```
# 54
Выведите название колонок и их тип данных для таблицы EMPLOYEES.
```sql
SELECT column_name
,data_type
FROM all_tab_columns
WHERE table_name = 'EMPLOYEES'
```
# 55
Отделу по работе с персоналом (Human Resources, HR) необходимы данные, включающие фамилию, код должности, дату найма и табельный номер для каждого служащего. Табельный номер должен выводиться первым. Определите псевдоним STARTDATE для столбца HIRE_DATE.
```sql
SELECT employee_id
,last_name
,job_id
,hire_date AS STARTDATE
FROM employees
ORDER BY hire_date
```
# 56
Отдел по работе с персоналом запрашивает данные о всех должностях из таблицы EMPLOYEES. В выводимых результатах идентификаторы должностей не должны повторяться.
```sql
SELECT DISTINCT job_id
FROM employees
```
# 57
Отделу HR необходим отчет о служащих, содержащим табельный номер, фамилию, должность, дату приема на работу. Назовите столбцы Emp, Employee, Job и Hire Date соответственно. Отсортируйте по первому столбцу.
```sql
SELECT
employee_id as "Emp#",
last_name as "Employee",
job_id as "Job",
hire_date as "Hire Date"
FROM
employees
ORDER BY employee_id
```
# 58
Отделу HR необходим отчет о всех сотрудниках и идентификаторах их должностей. Выведите на экран имя, соединенное с идентификатором должности через запятую и пробел. Назовите новый столбец Employee and Title.
```sql
SELECT first_name || ', ' || job_id AS "Employee and Title"
FROM employees
```
# 59
Создайте запрос для вывода всех данных из таблицы EMPLOYEES, чтобы познакомиться с ее содержимым таблицы.
Разделите значения столбцов запятыми и выведите их в одном столбце с наименованием THE_OUTPUT
```sql
SELECT employee_id ||','|| first_name ||','|| last_name ||','|| email ||','|| phone_number ||','|| hire_date ||','|| job_id ||','|| salary ||','|| commission_pct ||','|| manager_id ||','|| department_id
AS the_output
FROM
employees
```
# 60
Вследствие проблем финансирования отделу HR необходим отчет, в котором показываются фамилии и оклады служащих, получающих более 12,000.
```sql
SELECT last_name, salary
FROM employees
WHERE salary > 12000
```
# 61
Создайте запрос для вывода фамилии и номера отдела служащего под номером 176
```sql
SELECT last_name, department_id
FROM employees
WHERE employee_id = 176
```
# 62
Отделу HR необходимы данные о высокооплачиваемых и низкооплачиваемых сотрудниках. Выведите фамилии и оклады всех служащих, чей оклад не входит в диапазон от 5000 до 12000.
```sql
SELECT last_name
,salary
FROM employees
WHERE salary NOT BETWEEN 5000 AND 12000
```
# 63
Создайте отчет для вывода фамилии, идентификатора должности и даты начала работы всех служащих, с фамилиями Matos и Taylor. Отсортируйте данные в порядке возрастания даты найма.
```sql
SELECT
last_name,
job_id,
hire_date
FROM
employees
WHERE
last_name = 'Matos'
OR last_name = 'Taylor'
ORDER BY
hire_date ASC
```
# 64
Выведите фамилию и номер отдела всех служащих из отделов 20 и 50. Отсортируйте данные по фамилиям в алфавитном порядке.
```sql
SELECT
last_name, department_id
FROM
employees
WHERE
department_id = 20 OR department_id = 50
ORDER BY
last_name
```
# 65
Выведите фамилии и оклады служащих отделов 20 и 50 , зарабатывающих от 5000 до 12,000. Назовите столбцы Employee и Monthly Salary, соответственно.
```sql
SELECT
last_name AS "Employee",
salary AS "Monthly Salary"
FROM
employees
WHERE
department_id IN (20, 50)
AND salary BETWEEN 5000 AND 12000
```
# 66
Отделу HR необходим отчет, в котором выводятся фамилии и даты найма всех служащих, нанятых в 1994 г.
```sql
SELECT last_name
,hire_date
FROM employees
WHERE hire_date like '%90'
```
# 67
Создайте отчет, содержащий фамилии и должности всех служащих, не имеющих менеджера.
```sql
SELECT last_name
,job_id
FROM employees
WHERE manager_id is null
```
# 68
Создайте отчет для вывода фамилий, окладов и комиссионные всех служащих, зарабатывающих комиссионные. Отсортируйте данные в порядке убывания окладов и комиссионных.
```sql
SELECT last_name
,salary
,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC, commission_pct DESC
```
# 71
Выведите все фамилии служащих, в которых третья буква – a.
```sql
SELECT last_name
FROM employees
WHERE instr(last_name, 'a') = 3
```
```sql
SELECT last_name
FROM employees
WHERE last_name like '__a%';
```
# 72
Выведите все фамилии служащих, в которых есть буквы “a” и “e”.
```sql
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '%a%'
AND last_name LIKE '%e%'
```
# 73
Запросите фамилии, должности и оклады всех служащих, работающих торговыми представителя (SA_REP) или клерками на складе (ST_CLERK), у которых не может быть равен 2500, 3500 или 7000
```sql
SELECT last_name
,job_id
,salary
FROM employees
WHERE (job_id IN ('SA_REP', 'ST_CLERK'))
AND (salary NOT IN (2500, 3500, 7000))
```
# 74
Получите фамилии, оклады и комиссионные всех служащих, у которых сумма комиссионных составляет 20 %.
```sql
SELECT last_name AS "employee"
,salary AS "monthly salary"
,commission_pct
FROM employees
WHERE commission_pct = .2;
```
# 75
Отделу HR требуется отчет, в котором приводится номер служащего, его фамилия, оклад и новый оклад, повышенный на 15% и округленный до целого. Столбец в отчете, содержащий новый оклад, должен иметь имя New Salary.
```sql
SELECT
employee_id,
last_name,
salary,
TRUNC(salary + (salary * 15 / 100), 0) AS "New Salary"
FROM
employees
```
# 77
Отделу HR требуется отчет, в котором приводится номер служащего, его фамилия, оклад и новый оклад, повышенный на 15% и округленный до целого. Столбец в отчете, содержащий новый оклад, должен иметь имя New Salary. Добавьте еще один столбец, который будет содержать результат вычитания старого оклада из нового. Назовите столбец Increase.
```sql
SELECT
employee_id,
last_name,
salary,
TRUNC(salary + (salary * 0.15), 0) AS "New Salary",
(TRUNC(salary + (salary * 0.15), 0) - salary) AS "Increase"
FROM
employees
```
# 79
Отделу HR необходимы сведения о продолжительности работы служащих. Для каждого служащего выведите фамилию и вычислите количество месяцев со дня найма до настоящего времени, округленное до ближайшего целого. Назовите столбец MONTHS_WORKED.
Результаты отсортируйте по длительности отработанного времени от новичков к старожилам. Сотрудники принятые в один день должны быть отсортированы по фамилии.
```sql
SELECT last_name
,round(months_between(sysdate,hire_date)) month_worked
FROM employees
ORDER BY months_between(sysdate, hire_date), last_name
```
# 80
Получите по каждому служащему отчет в следующем виде: "<фамилия> зарабатывает <оклад> в месяц, но желает <утроенный оклад>. " Назовите столбец Dream Salaries.
Фразу построить на английском языке.
Пример:
Dream salaries
King earns $24,000.00 monthly but wants $72,000.00.
Kochhar earns $17,000.00 monthly but wants $51,000.00.
De Haan earns $17,000.00 monthly but wants $51,000.00.
Между словами должен стоять только один пробел.
</br>
<center><img src="https://i.imgur.com/c86c4ZV.jpg" alt="Решение правильное, ошибка в системе." width="90%" height="auto" /><br>
<i>Решение правильное, ошибка в системе.</i></center>
</br>
```sql
SELECT (last_name
|| ' earns '
|| TRIM(to_char (salary,'$99,999.00'))
|| ' monthly but wants '
||TRIM(to_char (salary*3,'$99,999.00'))
|| '.') AS "Dream Salaries"
FROM employees
```
# 82
<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
Для каждого служащего выведите фамилию, дату найма и дату пересмотра зарплаты, которая приходится на первый понедельник после шести месяцев работы. Назовите столбец REVIEW. Формат даты при выводе имеет вид: “Monday, the Thirty-First of July, 2000.”
```sql
SELECT
last_name,
hire_date,
TO_CHAR(
NEXT_DAY(ADD_MONTHS(hire_date, 6), 'MONDAY'),
'fmDay, "the" Ddspth "of" Month, YYYY'
) REVIEW
FROM
employeesA
SELECT
last_name,
hire_date,
salary,
to_char(
next_day(add_months(hire_date, 6), 'Monday'),
'yyyy" year "MM" month "DD" day "DAY'
) REVIEW
FROM
employees
SELECT
last_name,
to_char (
hire_date,
'dd-mon-yy',
'nls_date_language=american'
) hire_date,
to_char (
next_day (add_months (hire_date, 6), 'понедельник'),
'fmday, "the" ddspth "of" month, yyyy',
'nls_date_language=american'
) review
FROM
employees
SELECT
last_name,
hire_date,
to_char(
next_day(
add_months(hire_date,6),
'MONDAY'
),
'fmDay, "the" Ddspth "of" Month, YYYY'
) REVIEW
FROM
employees
```
</div>
# 83
<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
По каждому служащему выведите фамилию, дату найма и день недели (на английском языке маленькими буквами), когда он был нанят на работу. Назовите последний столбец DAY. Отсортируйте результаты по дням недели, начиная с понедельника.
```sql
```
</div>
# 84
Напишите запрос для вывода фамилии и суммы комиссионных каждого служащего. Если служащий не зарабатывает комиссионных, укажите в столбце “No Commission” Назовите столбец COMM.
```sql
SELECT
last_name,
NVL(TO_CHAR(commission_pct), 'No Commission') COMM
FROM
employees
```
# 85
Напишите запрос для отображения первых восьми букв фамилий сотрудников и разделенных пробелом их заработной платы в виде гистограммы, состоящей из звездочек. Каждая звездочка означает 1000\$ (первый диапазон 0-1000 - одна звездочка). Строки должны быть отсортированы по заработной плате в убывающем порядке. Результат должен быть выведен одним столбцом, озаглавленным как salary_rating .
```sql
SELECT
SUBSTR(last_name, 1, 8) || rpad(' ', salary / 1000 + 1, '*') AS "salary_rating"
FROM
employees
ORDER BY
salary DESC
```
# 86
Используя функцию DECODE, напишите запрос для отображения должности сотрудника и ее разряда (grade). Разряд каждого типа должности JOB_ID приведен в таблице:
Должность Разряд
AD_PRES A
ST_MAN B
IT_PROG C
```sql
SELECT
JOB_ID "Должность",
(
case
JOB_ID
when 'AD_PRES' THEN 'A'
when 'ST_MAN' THEN 'B'
when 'IT_PROG' THEN 'C'
when 'SA_REP' THEN 'D'
when 'ST_CLERK' THEN 'E'
ELSE '0'
END
) G
FROM
EMPLOYEES
```
# 87
Напишите запрос для вывода самого высокого, самого низкого и среднего оклада по всем служащим, а также суммы всех окладов. Назовите столбцы Maximum, Minimum, Sum и Average. Округлите суммы до ближайшего целого значения.
```sql
SELECT ROUND(MAX(salary),0) "Maximum"
,ROUND(MIN(salary),0) "Minimum"
,ROUND(SUM(salary),0) "Sum"
,ROUND(AVG(salary),0) "Average"
FROM employees
```
# 88
Выведите список должностей и укажите для каждой должности самый высокий, самый низкий, сумму окладов и средний оклад отдельно округилв значения до целого.
```sql
SELECT
JOB_ID,
MAX(salary),
MIN(salary),
SUM(salary),
round(AVG(salary))
FROM
EMPLOYEES
GROUP BY
JOB_ID
```
# 89
Напишите запрос для вывода должности и количества служащих, занимающих каждую должность. Отсортируйте результат по должностям в порядке возрастания.
```sql
SELECT job_id, count(*)
FROM employees e
GROUP by job_id
ORDER by job_id
```
# 90
Получите количество служащих, имеющих подчиненных, без их перечисления. Назовите столбец Number of Managers. Подсказка: используйте столбец MANAGER_ID для определения числа менеджеров.
```sql
SELECT COUNT(DISTINCT manager_id) "Number of Managers" FROM employees
```
# 91
Напишите запрос для вывода разности между самым высоким и самым низким окладами. Назовите столбец DIFFERENCE.
```sql
SELECT
(max (salary) - min (salary)) DIFFERENCE
FROM
employees
```
# 92
Напишите запрос для вывода номера каждого менеджера и заработной платы самого низкооплачиваемого из его подчиненных. Исключите всех, для которых неизвестны их менеджеры. Исключите все группы, где минимальный оклад составляет менее $6000. Отсортируйте выходные строки в порядке убывания оклада.
```sql
SELECT
manager_id,
min (salary) min_salary
FROM
employees
WHERE
manager_id is not null
HAVING
min (salary) > 6000
GROUP BY
manager_id
ORDER BY
min_salary desc
```
# 93
Напишите запрос для вывода общего количества служащих и количества служащих, нанятых в 1995, 1996, 1997 и 1998 годах. Дайте соответствующие заголовки столбцам
https://github.com/DmitryShuvaev/Oracle-SQL-PLSQL/blob/master/Oracle-SQL/lab6.sql
```sql
SELECT
COUNT(employee_id) TOTAL,
COUNT(decode(to_char(hire_date, 'YYYY'), '1995', 1995)) "1995",
COUNT(decode(to_char(hire_date, 'YYYY'), '1996', 1996)) "1996",
COUNT(decode(to_char(hire_date, 'YYYY'), '1997', 1997)) "1997",
COUNT(decode(to_char(hire_date, 'YYYY'), '1998', 1998)) "1998"
FROM
employees
```
# 94
Напишите матричный запрос для вывода всех должностей и суммы заработной платы служащих, работающих в этой должности в отделах 20, 50, 80 и 90. Последний столбец должен содержать сумму заработной платы служащих этих отделов, занимающих каждую конкретную должность. Дайте столбцам
соответствующие заголовки - Job, Dept 20, Dept 50, Dept 80, Dept 90, TOTAL.
```sql
select job_id "Job",
nvl(sum(decode(department_id,20,salary)),0) "Dept20",
nvl(sum(decode(department_id,50,salary)),0) "Dept50",
nvl(sum(decode(department_id,80,salary)),0) "Dept80",
nvl(sum(decode(department_id,90,salary)),0) "Dept90",
nvl(sum(decode(department_id,20,salary)),0)+nvl(sum(decode(department_id,50,salary)),0)+nvl(sum(decode(department_id,80,salary)),0)+
nvl(sum(decode(department_id,90,salary)),0) "Total"
from employees
group by job_id
```
```sql
SELECT
job_id "Job",
SUM(DECODE(department_id, 20, salary)) "Dept 20",
SUM(DECODE(department_id, 50, salary)) "Dept 50",
SUM(DECODE(department_id, 80, salary)) "Dept 80",
SUM(DECODE(department_id, 90, salary)) "Dept 90",
SUM(salary) "TOTAL"
FROM
employees
GROUP BY
job_id
```
```sql
SELECT JOB_ID "Job"
,CASE WHEN department_id = 20 THEN SUM(salary) ELSE 0 END "Dept 20"
,CASE WHEN department_id = 50 THEN SUM(salary) ELSE 0 END "Dept 50"
,CASE WHEN department_id = 80 THEN SUM(salary) ELSE 0 END "Dept 80"
,CASE WHEN department_id = 90 THEN SUM(salary) ELSE 0 END "Dept 90"
,SUM(salary)total
FROM EMPLOYEES
GROUP BY JOB_ID
,department_id
```
# 95
Создайте отчет, при выполнении которого выдаются адреса всех отделов. Используйте таблицы LOCATIONS и COUNTRIES. Выведите код местоположения, адрес (street_address), город, штат или провинцию, а также страну. Для получения результатов используйте натуральное соединение.
```sql
SELECT location_id, street_address, city, state_province, country_name
FROM locations l , countries c
WHERE l.country_id = c.country_id
```
```sql
SELECT location_id, street_address, city, state_province, country_name
FROM locations
NATURAL JOIN countries
```
# 96
Отделу HR необходим отчет о всех служащих. Напишите запрос для вывода фамилии, номера отдела и названия отдела для всех служащих. Отсортируйте по второму полю.
```sql
SELECT E.last_name
,E.department_id
,D.department_name
FROM employees E
JOIN departments D
ON E.department_id = D.department_id
ORDER BY 2
```
# 97
Отделу HR необходим отчет о сотрудниках в Торонто. Напишите запрос для вывода фамилии, должности, номера отдела и названия отдела всех служащих, работающих в городе Toronto.
```sql
SELECT
e.last_name,
e.job_id,
d.department_id,
d.department_name
FROM
employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
WHERE
l.city = 'Toronto
```
# 98
Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr. Отсортируйте по номеру служащего.
```sql
SELECT e.last_name "Employee"
,e.employee_id "Emp#"
,m.last_name "Manager"
,m.employee_id "Mgr#"
FROM employees e, employees m
WHERE (e.manager_id = m.employee_id)
ORDER BY "Emp#"
```
# 99
Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr.
Получите фамилии всех служащих, включая Кинга, который не имеет менеджера. Упорядочьте результат по возрастанию номера служащего.
:max_bytes(150000):strip_icc()/0iHiL-d7a0c49a861448cb94477386a6f3f05b.png)
```sql
SELECT
w.last_name "Employee",
w.employee_id "EMP#",
m.last_name "Manager",
m.employee_id "Mgr#"
FROM
employees w
LEFT OUTER JOIN employees m
ON w.manager_id = m.employee_id
```
# 100
Подготовьте отчет для отдела HR, в котором показываются номер отдела, фамилия служащего и фамилии всех служащих, работающих в одном отделе с данным служащим. Дайте столбцам соответствующие имена. Отсортируйте результат в порядке приоритета по отделу, фамилии и фамилии коллеги сотрудника.
```sql
SELECT
e.department_id department,
e.last_name employee,
c.last_name colleague
FROM
employees e,
employees c
WHERE
e.department_id = c.department_id
AND e.employee_id <> c.employee_id
ORDER BY
e.department_id,
e.last_name,
c.last_name
```
# 101
Для отдела HR необходимы сведения о том, какие сотрудники были наняты после приема на работу после Davies. Создайте запрос для вывода фамилий и дат найма всех таких служащих.
```sql
SELECT
e.last_name,
e.hire_date
FROM
employees e,
employees davies
WHERE
davies.last_name = 'Davies'
AND davies.hire_date < e.hire_date
```
# 102
Отделу HR необходимы сведения о всех служащих, нанятых раньше своих менеджеров. Выведите фамилии и даты найма таких служащих, а также фамилии и даты найма их менеджеров. Колонки назовите emp_last_name, emp_hire_date, man_last_name, man_hire_date
```sql
SELECT
e.last_name "emp_last_name",
e.hire_date "emp_hire_date",
m.last_name "man_last_name",
m.hire_date "man_hire_date"
FROM
employees e
JOIN employees m ON (e.manager_id = m.employee_id)
WHERE
m.hire_date > e.hire_date
```
# 103
Отделу HR необходимы данные о фамилиях и даты найма сотрудников, работающих в одном отделе с King (сам этот служащий не выводится).
```sql
SELECT emp.last_name,
emp.hire_date
FROM employees emp
WHERE emp.department_id IN ( SELECT department_id FROM employees WHERE last_name = 'King')
AND emp.last_name != 'King'
```
# 104
Создайте запрос для вывода номеров,и фамилий, и окладов всех служащих, оклад которых выше среднего. Отсортируйте выходные данные в порядке увеличения окладов.
```sql
SELECT
employee_id,
last_name,
salary
FROM
employees
WHERE
salary > (
SELECT
AVG(salary)
FROM
employees
)
ORDER BY
salary ASC
```
# 105
Создайте запрос для вывода номеров и фамилий всех служащих, работающих в одном отделе с любым служащим, фамилия которого содержит букву “u”.
```sql
SELECT
employee_id,
last_name
FROM
employees
WHERE
department_id IN (
SELECT
department_id
FROM
employees
WHERE
last_name like '%u%'
)
```
# 106
Отделу HR необходим отчет, в котором выводятся фамилии, номера отделов и должности служащих, идентификатор местоположения отдела которых равен 1700.
```sql
SELECT
last_name,
department_id,
job_id
FROM
employees
WHERE
department_id IN (
SELECT
department_id
FROM
departments
WHERE
location_id = 1700
)
```
# 107
Подготовьте отчет для отдела HR, в котором выводится список фамилий и окладов всех служащих, подчиненных Кингу (King).
```sql
SELECT
last_name,
salary
FROM
employees
WHERE
manager_id = (
SELECT
employee_id
FROM
employees
WHERE
last_name = 'King'
AND first_name = 'Steven'
)
```
# 108
Подготовьте отчет для отдела HR, в котором выводится номер отдела, фамилия и код должности для каждого служащего, работающего в администрации (department_name = 'Executive')
```sql
SELECT
department_id,
last_name,
job_id
FROM
employees
WHERE
department_id IN (
SELECT
department_id
FROM
departments
WHERE
department_name = 'Executive'
)
```
# 109
Создайте запрос для вывода номеров и фамилий всех служащих и их оклад, работающих в одном отделе с любым служащим, фамилия которого содержит букву “u” и при условии, что оклады превышают средний.
```sql
SELECT
employee_id,
last_name,
salary
FROM
employees
WHERE
(
salary > (
SELECT
AVG(salary)
FROM
employees
)
)
AND department_id IN (
SELECT
department_id
FROM
employees
WHERE
last_name LIKE '%u%'
)
```
# 110
Отделу по работе с персоналом (Human Resources, HR) необходим список номеров отделом, в которых нет сотрудников с идентификатором должности ST_CLERK. Используйте операторы над множествами для создания отчета.
```sql
SELECT
department_id
FROM
departments
MINUS
SELECT
department_id
FROM
employees
WHERE
job_id like 'ST_CLERK'
```
# 111
Отделу HR необходим перечень стран, в которых не располагаются подразделения компании. Выведите
идентификаторы и названия таких стран.
```sql
SELECT
country_id,
country_name
FROM
countries
WHERE
country_id NOT IN (
SELECT
E.country_id
FROM
departments B
JOIN locations C ON (B.location_id = C.location_id)
JOIN countries E ON (E.country_id = C.country_id)
)
```
# 112
Используя операторы над множествами, выведите список должностей отделов 10, 50 и 20 в таком же порядке отделов. Включите в отчет столбцы job_id и department_id (назовите так же). Внутри отделов строки должны быть отсортированы по job_id .
```sql
SELECT
job_id,
department_id
FROM
(
SELECT
job_id,
department_id
FROM
employees
WHERE
department_id IN (10, 20, 50)
INTERSECT
SELECT
job_id,
department_id
FROM
employees
)
ORDER BY
decode (department_id, 10, 1, 50, 2, 20, 3),
job_id
```
# 113
Выведите номер сотрудника и идентификатор его должности, если его текущая должность совпадает с той, которую он уже занимал, работая в компании
```sql
SELECT
employee_id,
job_id
FROM
employees
INTERSECT
SELECT
employee_id,
job_id
FROM
job_history
```
# 115
HR необходима информация о всех клерках (ST_CLERK), устроенных на работу после 1997 года.
```sql
SELECT *
FROM
employees
WHERE
(job_id IN ('ST_CLERK'))
AND (to_char(hire_date, 'YYYY') > '1997')
```
# 116
HR необходим отчёт о сотрудниках и стаже их работы. Отчёт должен включать в себя поля: фамилия, полных лет работы и полных месяцев работы. Для лет и месяцев дать имена YEARS и MONTHS. Полученные данные необходимо отсортировать так, чтобы сверху списка отображался сотрудник с самым большим стажем работы
```sql
SELECT
last_name,
floor(MONTHS_BETWEEN(SYSDATE, hire_date)/12) AS "YEARS" ,
mod(floor(MONTHS_BETWEEN(SYSDATE, hire_date)), 12) AS "MONTHS"
FROM
employees
ORDER BY years DESC, months DESC
```
# 117
Отобразить фамилии сотрудников, которые начинаются на букву J, K, L или M.
```sql
SELECT
last_name
FROM
employees
WHERE
last_name like 'J%'
OR last_name like 'K%'
OR last_name like 'L%'
OR last_name like 'M%'
```
# 118
Создать отчёт для отображения фамилии, заработной платы и поля со значением Yes, если комиссия есть, и No, если её нет.
```sql
SELECT
last_name,
salary,
CASE
WHEN commission_pct > 0 THEN 'Yes' ELSE 'No'
END
FROM
employees
```
# 119
Создайте отчёт, в который включены номер отдела, название отдела, идентификатор расположения и количество сотрудников в этом отделе.
Убедитесь, что результат запроса также содержит отделы без сотрудников.
```sql
SELECT
d.department_id,
d.department_name,
d.location_id,
COUNT(e.employee_id)
FROM
departments d
LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY
d.department_id,
d.department_name,
d.location_id
```
# 120
Вывести фамилию и день недели всех сотрудников, день недели устройства которых является самым частым в компании
День недели вывести в верхнем регистре.
```sql
SELECT
last_name,
TO_CHAR(hire_date, 'DAY')
FROM
employees
where
TO_CHAR(hire_date, 'day') = (
SELECT
TO_CHAR(hire_date, 'day')
from
employees
group by
TO_CHAR(hire_date, 'day')
having
count(TO_CHAR(hire_date, 'day')) = (
select
MAX(count(TO_CHAR(hire_date, 'day')))
from
employees
group by
TO_CHAR(hire_date, 'day')
)
)
```
# 201
Всем сотрудникам отдела 60 надо разослать сообщение по электронной почте. Сформируйте строку рассылки для вставки в почтовый месенджер.
Строка должна содержать все адреса эелектронной почты с добавлением домена компании "@company.com" и разделенных точкой с запятой и пробелом. Адреса должны следовать в алфавитном порядке.
Колонку с адресом назвать MailString
Пример строки:
AHUNOLD@company.com; BERNST@company.com; DAUSTIN@company.com; DLORENTZ@company.com; VPATABAL@company.com
```sql
SELECT
LISTAGG(CONCAT(email, '@company.com'), '; ') WITHIN GROUP (
ORDER BY
email
) AS "MailString"
FROM
employees
WHERE
department_id = 60
```
# 202
Вывести иерархию сотрудников(фамилии) начиная с главы компании. Каждую ступень отделять тремя знаками тире (‘---‘). Сотрудников одной ступени сортировать по фамилии.
Пример:
Путин
---Мишустин
------Белоусов
---------Колокольцев
---Шойгу
------Шевцова
site: https://livesql.oracle.com/apex/livesql/file/tutorial_GQMLEEPG5ARVSIFGQRD3SES92.html
```sql
SELECT
LPAD('---', 3 * (LEVEL -1), '---') || last_name AS Result
FROM
employees start
WITH manager_id is null
connect by prior employee_id = manager_id
ORDER SIBLINGS BY last_name
```
</div>
# 203
Почтовым адресам из списка была произведена рассылка:
AHUNOLD@company.com; ISCIARRA@company.com; DAUSTIN@company.com; VPATABAL@company.com; PFAY@company.com
Выяснить, сотрудники каких отделов получили письмо.
```sql
SELECT department_id
FROM employees
WHERE email in ('AHUNOLD', 'ISCIARRA', 'DAUSTIN', 'VPATABAL','PFAY')
```
# 204
Вывести фамилию, должность и зарплату сотрудников, чей оклад отличается менее чем на 1000 от максимально допустимого на его должности.
```sql
SELECT e.last_name, e.job_id, e.salary
FROM employees e
JOIN jobs j ON e.job_id = j.job_id
WHERE (j.max_salary - e.salary) < 1000
```
# 205
Вывести табельный номер, фамилию и оклад сотрудников с повторяющимися значениями зарплаты. Отсортировать по величине оклада и фамилии сотрудника.
Пример:
108 Емельянов 4500
256 Панов 4500
142 Сергеев 4600
102 Текутов 4600
```sql
SELECT
employee_id,
last_name,
salary
FROM
employees
WHERE
salary in (
SELECT
salary
FROM
employees
GROUP BY
salary
HAVING
COUNT(*) > 1
)
ORDER BY
salary,
last_name
```
# 206
Вывести отделы, численность которых превышала 5 человек в 1997 году.
```sql
SELECT
department_id
FROM
employees
WHERE
hire_date BETWEEN '01.01.1997'
AND '12.31.1997'
HAVING
COUNT (*) > 5
GROUP BY
department_id
```
# 207
<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
Вывести топ-3 отдела по заработной плате, следом за ними фамилию и зарплату самых высокооплачиваемых сотрудников этих отделов. Назвать столбцы “Dep#”, “Avg_Sal”, “Emp”, “Emp_Sal”.
```sql
WITH dep_salary AS
(SELECT department_id, sum(salary) AS salary
FROM employee
GROUP BY department_id)
SELECT department_id
FROM dep_salary
WHERE dep_salary.salary = (SELECT max(salary) FROM dep_salary);
```
</div>
# 208
Вывести должность, табельный номер, фамилию и зарплату трёх сотрудников, занимающих:
- 3-е место в рейтинге зарплат должности “SH_CLERK”
- 9-ое место в рейтинге зарплат должности “ST_CLERK”
- 27-ое место в рейтинге зарплат должности “SA_REP”
```sql
SELECT job_id, employee_id, last_name, salary
FROM
(
SELECT job_id, employee_id, last_name, salary,
row_number() OVER( ORDER BY salary) AS rn
FROM
employees
WHERE
job_id = 'SH_CLERK'
)
WHERE
rn = 3
UNION
SELECT job_id, employee_id, last_name, salary
FROM
(
SELECT job_id, employee_id, last_name, salary,
row_number() OVER( ORDER BY salary) AS rn
FROM
employees
WHERE
job_id = 'ST_CLERK'
)
WHERE
rn = 9
UNION
SELECT job_id, employee_id, last_name, salary
FROM
(
SELECT job_id, employee_id, last_name, salary,
row_number() OVER( ORDER BY salary) AS rn
FROM
employees
WHERE
job_id = 'SA_REP'
)
WHERE
rn = 27
```
# 209
<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
Вывести табельный номер, фамилию и номер отдела сотрудников, чья зарплата составляет более 20% от общей суммы зарплат сотрудников отдела. В расчет брать только те отделы, численность которых превышает 5 человек.
```sql
SELECT
a.employee_id,
a.last_name,
a.department_id
FROM
employees a
WHERE
a.department_id in (
SELECT
department_id
FROM
employees
GROUP BY
department_id
HAVING
COUNT(department_id) > 5
) and
(
(SELECT
SUM(b.salary)
FROM
employees b
WHERE
a.department_id = b.department_id
)*0.2 < a.salary
)
```
</div>
# 301
Описание: вывести название всех стран из таблицы Countries и количество сотрудников в них, последнюю колонку назвать «Employees». Результат отсортировать по названия страны
```sql
SELECT
c.country_name,
COUNT(e.employee_id) AS "Employees"
FROM
countries c
LEFT JOIN locations l ON c.country_id = l.country_id
LEFT JOIN departments d ON l.location_id = d.location_id
LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY
c.country_name
ORDER BY
c.country_name
```