--- 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. Получите фамилии всех служащих, включая Кинга, который не имеет менеджера. Упорядочьте результат по возрастанию номера служащего. ![](https://www.thoughtco.com/thmb/xh4MUu8HQyX1JVEcxn2IorWogoo=/1500x0/filters:no_upscale():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 ```