Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Main_Table PK User_Constraints 19 страница

Main_Table PK User_Constraints 8 страница | Main_Table PK User_Constraints 9 страница | Main_Table PK User_Constraints 10 страница | Main_Table PK User_Constraints 11 страница | Main_Table PK User_Constraints 12 страница | Main_Table PK User_Constraints 13 страница | Main_Table PK User_Constraints 14 страница | Main_Table PK User_Constraints 15 страница | Main_Table PK User_Constraints 16 страница | Main_Table PK User_Constraints 17 страница |


Читайте также:
  1. 1 страница
  2. 1 страница
  3. 1 страница
  4. 1 страница
  5. 1 страница
  6. 1 страница
  7. 1 страница

 

SELECT department_name,last_name,round(sum(sal)*100,2) sal

FROM

(SELECT department_name,last_name,ratio_to_report(salary) over () sal

FROM employees join departments using(department_id)

)

GROUP BY GROUPING SETS ((department_name,last_name),(department_name))

ORDER BY department_name, grouping_id(last_name) desc, last_name


Результат:

 

Комментарий:

Для вычисления доли зарплаты сотрудников в общем фонде зарплаты использовалась аналитическая функция ratio_to_report(), результат умножался на 100, для вывода результата в процентах, при этом записи группируются в наборы ((department_name,last_name),(department_name)) для расчета доли зарплаты одного сотрудника к общему фонду зарплат и доли подразделения.

 

13. Одной командой SELECT вывести наиболее часто встречающиеся имена сотрудников. Если несколько имен встречаются чаще всего, то вывести все эти имена.

SELECT first_name

FROM (SELECT first_name, COUNT(first_name) AS k

FROM employees

GROUP BY first_name)

WHERE k=(SELECT k

FROM(SELECT first_name, COUNT(first_name) AS k

FROM employees

GROUP BY first_name

ORDER BY k desc)

WHERE rownum=1)

 

Результат:

 

FIRST_NAME

--------------------

Peter

John

David

 

3 rows selected

 

Комментарий:

Сотрудники группируются по имени, вычисляется количество человек с одинаковыми именами, после чего строки сортируются по количеству человек в группе по убыванию. Количество человек в первой строке- -максимальное количество человек с одинаковым именем. После чего выбираются те строки, в которых количество имен равно максимальному.

 

14. Одной командой SELECT вывести всех сотрудников, которые приняты на работу раньше руководителя подразделения компании, к которому они приписаны в данный момент. В результате вывести следующие данные:

1. Название подразделения компании

2. Имя сотрудника

3. Фамилия сотрудника

4. На сколько суток раньше руководителя подразделения данный сотрудник был принят на работу

 

SELECT department_name, e1.first_name, e1.last_name, e2.hire_date-e1.hire_date AS difference

FROM departments JOIN employees e1 ON (departments.department_id=e1.department_id) INNER JOIN employees e2 On (e1.manager_id=e2.employee_id and e1.department_id=e2.department_id and e1.hire_date<e2.hire_date)

 

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


Результат:

 

 

15. Создать запрос для определения всех ветвей от начальных вершин до всех конечных вершин по направленному дереву. В пределах одной ветви необходимо перемножить поле Количество и просуммировать результат по веткам от одной начальной вершины до одной конечной вершины. Пример исходной таблицы:

 

Номер дочерней вершины Номер родительской вершины Количество
     
     
     
     
     
     
     

 

 

Результат:

 

Начальная вершина Конечная вершина Количество ветвей Сумма произведентй
       
       

 

INSERT INTO tree values (2,1,2);

INSERT INTO tree values (5,1,2);

INSERT INTO tree values (3,2,1);

INSERT INTO tree values (4,2,2);

INSERT INTO tree values (4,6,2);

INSERT INTO tree values (6,5,3);

INSERT INTO tree values (4,3,2);

 

WITH ch AS (SELECT child_number

FROM tree

MINUS

SELECT parent_number

FROM tree),

p as (SELECT distinct parent_number FROM tree

MINUS

SELECT distinct child_number FROM tree),

max_level as

(SELECT max(LEVEL)

FROM tree

WHERE child_number IN (SELECT * FROM ch)

START WITH parent_number IN (SELECT * FROM p)

CONNECT BY parent_number= PRIOR child_number)

 

SELECT T.start_node "Начальная_вершина", T.child_number "Конечная вершина", COUNT(*)

Количество ветвей", k.kol "Сумма произведений"

FROM(SELECT CONNECT_BY_ROOT (parent_number) AS start_node, child_number

FROM tree

WHERE child_number IN (SELECT * FROM ch)

START WITH parent_number IN (SELECT * FROM p)

CONNECT BY parent_number= PRIOR child_number) T

JOIN (SELECT par, fin, SUM(kol) kol

FROM (SELECT k.par par, k.l,k.finish_node fin, temp, round(exp(sum(ln(LTRIM(regexp_substr(K.KOL,',[0-9]+',1,t.n), ','))))) kol

FROM (SELECT LEVEL l, CONNECT_BY_ROOT(parent_number) par, sys_connect_by_path(child_number,'--> ') temp, REGEXP_SUBSTR(sys_connect_by_path(child_number,'--> '),'[^(-->)]*$') finish_node, sys_connect_by_path(KOLVO,',') KOL

FROM tree

WHERE child_number IN (SELECT * FROM ch)

START WITH parent_number IN (SELECT * FROM p)

CONNECT BY parent_number= PRIOR child_number

ORDER BY 2,1) k,(SELECT level n FROM dual

CONNECT BY level <= (SELECT * FROM max_level)) t

WHERE t.n<=k.l

GROUP BY k.par, k.l, k.finish_node, temp)

GROUP BY par, fin) k

ON k.par=t.start_node AND k.fin=t.child_number

GROUP BY T.start_node, T.child_number, k.kol;

 

Результат:

 

Начальная_вершина Конечная вершина Количество ветвей Сумма произведений

------------------------------- ------------------------- ---------------------- ----------------------

1 4 3 20

 

Комментарий:

Ch – вершины, не являющиеся родительскими

P – вершины, не являющиеся потомками

Max_level- количество уровней дерева

Первоначально определяются все возможные ветви дерева от начальных вершин до конечных.

Для одинаковых начала и конца считается количество ветвей. Для каждой ветви строится последовательность весов, разделенных запятыми. Вспомогательный столбец temp показывает путь от начальной вершины к конечной для каждой ветви. По этому параметру группируются записи для вычисления произведения весов на каждой ветви, после чего эти произведения суммируются для каждой пары (начальная вершина, конечная вершина). Произведение вершин ищется по формуле: exp(sum(ln(x)). Для вычленения весов из последовательности используется регулярное выражение LTRIM(regexp_substr(K.KOL,',[0-9]+',1,t.n), ',').

 

16. Создать запрос для замены в символьном выражении запятых, стоящих в самых глубоких двойных кавычках, на дефисы. Вложенные двойные кавычки выделяются нечетным количеством слэшей. Например, из исходного символьного выражения:

Раз 2 Три “ 5678 /“hhhh /“273,34,567///” двести семьдесят три/” 234 “

должно быть получено:

Раз 2 Три “ 5678 “hhhh “273-34-567 двести семьдесят три” 234 “

 

SELECT regexp_replace((substr(str,1,regexp_instr(str, '"[^"]*//')-1)||regexp_replace(regexp_substr(str, '"[^"]*//'), ',','-')||

substr(str,regexp_instr(str, '"[^"]*//')+length(regexp_substr(str, '"[^"]*//')), length(str))),'/','') as new_str

FROM (SELECT '" 5678 /"hhhh /"273,34,567///" двести семьдесят три/" 234 "' str

FROM dual)

 

Результат:

 

NEW_STR

-----------------------------------------------------

" 5678 "hhhh "273-34-567" двести семьдесят три" 234 "

 

 

Комментарий:

Первоначально вычисляется местоположение открывающихся внутренних кавычек, после чего строка делится на три части: до этих кавычек, выражение в кавычках и после закрывающейся кавычки. В выражении, стоящем во внутренних кавычках запятые меняются на ‘ -’, после чего строка вновь собирается вместе, и из нее удаляются слэши.

 

17. Создать запрос для вывода информации о студентах, у которых интервал между датами сдачи экзаменов составляет менее трех дней. Информацию вывести в виде:

Фамилия Дисциплина 1 Дата сдачи1 Дисциплина 2 Дата сдачи 2
         

SELECT фамилия, disc1 as "Дисциплина1",d2 as "Дата сдачи1",название as "Дисциплина2",d1 as "Дата сдачи1"

FROM (

SELECT фамилия,дата d1,название,lag(дата,1,null)over(partition by номер_студента order by дата) as d2,lag(название,1,null)over(partition by номер_студента order by номер_дисциплины) as disc1

FROM успеваемость join студенты using(номер_студента) join дисциплины using(номер_дисциплины)

ORDER BY номер_студента,дата)

WHERE (d2 is not null) and d1-d2<3

 

Результат:

 

 

Комментарий:

Для того, чтобы в одной таблице размещались все необходимые столбцы были соединены таблицы: Успеваемость, Студенты и Дисциплины.

При решении задачи я использовала аналитическую функцию lag() для того чтобы сместить значение в столбцах ДАТА и ДИСЦИПЛИНА на 1 строку вниз, при этом группируя записи по номеру студента. В результате, у студентов, сдававших 2 и более экзаменов все столбцы оказались заполненными, а у остальных – нет. После чего была произведена выборка записей, где значение Дата сдачи2-d2 Дата сдачи1<3, т.е. между экзаменами прошло менее 3 дней.

 

18. Для каждого отдела из таблицы Departments отобразить в виде одной строки с запятой в качестве разделителя фамилии сотрудников, работающих в нем. Фамилии сотрудников должны быть отсортированы по алфавиту.

 

SELECT department_id, max(ltrim(sys_connect_by_path(last_name, ', '), ', ')) employees

FROM (SELECT department_id, last_name,

row_number () over (partition by department_id order by last_name) rown

FROM employees)

WHERE department_id is not null

START WITH rown=1

CONNECT BY PRIOR rown = rown-1 and PRIOR department_id = department_id

GROUP BY department_id

 

Результат:

 

DEPARTMENT_ID EMPLOYEES

---------------------- ----------------------------------------------------------------------------------------------------------------

10 Whalen

20 Fay, Hartstein

30 Baida, Colmenares, Himuro, Khoo, Raphaely, Tobias

40 Mavris

50 Atkinson, Bell, Bissot, Bull, Cabrio, Chung, Davies, Dellinger, Dilly, Everett, Feeney, Fleaur,
Fripp, Gates, Gee, Geoni, Grant, Jones, Kaufling, Ladwig, Landry, Mallin, Markle, Marlow,
Matos, McCain, Mikkilineni, Mourgos, Nayer, OConnell, Olson, Patel, Perkins, Philtanker,
Rajs, Rogers, Sarchand, Seo, Stiles, Sullivan, Taylor, Vargas, Vollman, Walsh, Weiss

60 Austin, Ernst, Hunold, Lorentz, Pataballa

70 Baer

80 Abel, Ande, Banda, Bates, Bernstein, Bloom, Cambrault, Cambrault, Doran, Errazuriz, Fox,
Greene, Hall, Hutton, Johnson, King, Kumar, Lee, Livingston, Marvins, McEwen, Olsen, Ozer,
Partners, Russell, Sewall, Smith, Smith, Sully, Taylor, Tucker, Tuvault, Vishney, Zlotkey

90 De Haan, King, Kochhar

100 Chen, Faviet, Greenberg, Popp, Sciarra, Urman

110 Gietz, Higgins

 

11 rows selected

 

Комментарий:

При помощи функции sys_connect_by_path строится дерево зависимостей служащих по каждому подразделению, при этом фамилии служащих сортируются по возрастанию, а затем, выбираются максимальные деревья по каждому подразделению – они то и будут содержать в себе список всех служащих в подразделении.

 

19. Для двух заданных сотрудников найти их ближайшего общего начальника.

 

SELECT distinct last_value(last_name) over() as last_name

FROM

(

SELECT last_name

FROM employees

WHERE last_name!='&&Name1'

START WITH last_name='&&Name1'

CONNECT BY PRIOR manager_id=employee_id

INTERSECT

(

SELECT last_name

FROM employees

WHERE last_name!='&&Name2'

START WITH last_name='&&Name2'

CONNECT BY PRIOR manager_id=employee_id

))

 

Результат:

 

Name1=Davies

Name2=Matos

 

 

LAST_NAME

---------------------

Mourgos

 

Комментарий:

В задаче используются 2 переменные подстановки: Name1 (фамилия первого сотрудника) и Name2 (фамилия второго сотрудника). Для каждого из них выводится иерархия менеджеров, которым подчиняется этот сотрудник. После чего при помощи оператора INTERSECT для них выбираются общие. Последним в списке будет ближайший общий начальник для этих сотрудников. Его находим при помощи аналитической функции Last_Value().

 

20. Создать запрос для получения информации о группах:

Группа Кол-во студентов Название Специальности Кол-во круглых отличников Кол-во должников
         
         
……        

 

SELECT номер_группы,название_специальности,nvl(kol_otl,0) as kol_otl, nvl(kol_dolg,0) as kol_dolg

FROM

((SELECT номер_группы,название_специальности

FROM группы join специальности using(код_специальности)) left join

(SELECT *

FROM

(SELECT distinct номер_группы,count(номер_студента) over(partition by номер_группы,оценка) as kol_otl

FROM(

SELECT номер_группы,название_специальности,номер_студента,оценка,count(номер_студента) over(partition by номер_группы) as kolvo,avg(оценка) over(partition by номер_студента) as otl

FROM(

SELECT номер_группы,название_специальности, номер_студента,оценка

FROM СТУДЕНТЫ join ГРУППЫ using(номер_группы)join специальности using(код_специальности) join УСПЕВАЕМОСТЬ using (номер_студента)))

WHERE otl=5)t1 full join

 

(SELECT distinct номер_группы, count(номер_студента) over(partition by номер_группы,оценка) AS kol_dolg

FROM (

SELECT номер_группы,count(номер_студента) over(partition by номер_группы) as kolvo, название_специальности,номер_студента,оценка,avg(оценка) over(partition by номер_студента) as otl

FROM(

SELECT номер_группы,название_специальности, номер_студента,оценка

FROM студенты join ГРУППЫ using(номер_группы)join специальности using(код_специальности) join УСПЕВАЕМОСТЬ using (номер_студента)))

WHERE оценка=2) t2 using(номер_группы)) using(номер_группы))

 

Результат:

 

НОМЕР_ГРУППЫ НАЗВАНИЕ_СПЕЦИАЛЬНОСТИ KOL_OTL KOL_DOLG

--------------- --------------------------------------------------------------- ---------------------- ----------------------

122 СИСТЕМЫ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ 1 0

121 СИСТЕМЫ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ 2 1

123 ЭКОНОМИКА ПРЕДПРИЯТИЙ 0 1

124 ЭКОНОМИКА ПРЕДПРИЯТИЙ 0 0

 

Комментарий:

Отдельно друг от друга из таблицы, полученной при объединении таблиц СТУДЕНТЫ, ГРУППЫ и УСПЕВАЕМОСТЬ, выбираются записи о круглых отличниках (это студенты, средний балл которых равен 5) и о должниках (студенты, оценка которых равна 2). После чего обе таблицы объединяются с таблицей ГРУППЫ, для получения информации об отличниках и должниках во всех группах.


ВАРИАНТ 21

(Базы данных HR и OE)

1. Используя только таблицу DUAL вычислить и вывести в результат все числа Фибоначчи в диапазоне от 1 до 1000 (1 <= n_fib <= 1000). Числа в результате не должны повторяться и должны быть отсортированы по возрастанию.

В результате должен получиться список из 15 чисел, отсортированных по возрастанию:

N_FIB
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

 

SELECT ltrim(Max(SYS_CONNECT_BY_PATH(fib, ' ')), ' ') fiblist

FROM (

SELECT n, fib, ROW_NUMBER()

OVER (ORDER BY n) r

FROM (select n, round((power((1+sqrt(5))*0.5, n)-power((1-sqrt(5))*0.5, n))/sqrt(5)) fib

from (select level n

from dual

connect by level <= 16) t1) t2

)

START WITH r=2

CONNECT BY PRIOR r = r-1;

 

FIBLIST

--------------------------------------------

1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

 

Комментарий:

С помощью row_number() получаем номер записи

Каждый раз считаем числа Фибоначчи по формуле, используя level.

Connect by - выполняем расчет пока истинно условие

Отобрали максимальную строчку, чтобы вывести 15 чисел

 

2. Создайте таблицу с именем ROW_DOUBLES, содержащую 5-7 столбцов типов VARCHAR2 / CHAR / DATE / NUMBER, используя команду CREATE TABLE … AS SELECT …;

Например:

CREATE TABLE row_doubles

AS

SELECT col_1, col_2, col_3, …, col_n

FROM so me_table

WHERE <необязательное_условие_отбора_строк>;

Здесь:

· SOME_TABLE – это какая-либо из доступных вам таблиц схемы HR или словаря данных Oracle Database,

· col_1, col_2, col_3, …, col_n – имена столбцов, выбираемых из таблицы SOME_TABLE.

· <необязательное_условие_отбора_строк> - какое-либо условие отбора строк из выбранной вами таблицы SOME_TABLE.

Добавьте в таблицу ROW_DOUBLES некоторое количество строк, которые повторяют уже существующие в ней строки. Например, так:

Одной командой SELECT отберите строки, которые нужно удалить из таблицы ROW_DOUBLES, чтобы в ней осталось точно по одному экземпляру каждой строки. При этом само собой разумеется, что если какая-то строка уникальна (не дублируется), то в выборку она попасть не должна. В каждом столбце таблицы могут быть NULL-значения в произвольном числе строк.

Команда SELECT, которая будет выводить результат, должна содержать в списке выброки * (звездочку), то есть выводить все поля таблицы ROW_DOUBLES в том порядке, как они были заданы при создании этой таблицы.

 

... -- необязательная часть результирующей команды SELECT

SELECT * FROM row_doubles

... -- обязательная часть результирующей команды SELECT

 

Внимание!

Количество полей таблицы, их названий и типов неизвестно.

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

 

CREATE TABLE row_doubles

AS

SELECT employee_id,first_name,last_name,hire_date, salary,manager_id

FROM employees

WHERE department_id=50;

 

Insert into row_doubles (employee_id,first_name, last_name, hire_date, salary, manager_id)

Values(120,'Mathew','Weiss', '18.07.1996',8000,100);

Insert into row_doubles (employee_id,first_name, last_name, hire_date, salary, manager_id)

Values(128,'Steven','Markle', '08.03.2000',2200,120);

Insert into row_doubles (employee_id,first_name, last_name, hire_date, salary, manager_id)

Values(140,'Joshua','Patel', '06.04.1998',2500,123);

 

select *

from row_doubles t1

where exists

(select * from row_doubles t2 where t2.rowid = t1.rowid

intersect

select * from row_doubles t3 where t3.rowid > t1.rowid)

 

 

Комментарий:

Создали таблицу, задав имена столбцов, выбираемых из таблицы employees, задав условие отбора строк department_id=50

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

Далее отобрали повторяющиеся строки с помощью операции пересечения.

 


3. Требуется, используя только таблицу DUAL, одной командой SELECT вывести все анаграммы четырехбуквенного слова, отсортированные по возрастанию.

Например, для слова АГАТ должно быть выведено:

АГАТ, ГАТА, АТАГ, ААГТ, ААТГ, ГААТ, ГТАА, ……..

 

select letters as anagram

from(

select replace(sys_connect_by_path(ch, '\'), '\') as letters, level as lvl

from

(select substr('&&word', rownum, 1) as ch from dual connect by level <= length('&word')

)

connect by

level <= length('&word') and length('&word')=4)

,

(select rownum as i from dual connect by level <= length('&word')

)

where nvl(length(replace(letters, substr('&word', i, 1))), 0) = nvl(length(replace('&word', substr('&word', i, 1))), 0)

and lvl = length('&word')

group by letters

having count(distinct i) = length('&word')

;

undefine word

 

ANAGRAM

--------

аагт

аатг

агат

агта

атаг

атга

гаат

гата

гтаа

тааг

тага

тгаа

 

Комментарий:

Вводим с клавиатуры четырехбуквенное слово.

С помощью sys_connect и connect by level производим перестановку букв и вывод всех возможных анаграмм

 

4. Для снижения конкуренции за ресурсы при изменении данных необходимо строить индексы по столбцам, входящим в ограничение внешнего ключа (Foreign key).

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

В результат вывести три столбца:

1. Название таблицы.

2. Название ссылочного ограничения целостности (внешнего ключа).

3. Название неиндексированного столбца данного ссылочного ограничения целостности.

Результат отсортировать по столбцам 1, 2 и 3 по возрастанию.

 

select uc.table_name,uc.constraint_name, ucc.column_name

from user_constraints uc left join user_cons_columns ucc

on uc.constraint_name = ucc.constraint_name

where uc.constraint_type = 'R' and not exists

(select * from user_ind_columns uic

where ucc.column_name = uic.column_name

and ucc.table_name = uic.table_name

and ucc.position = uic.column_position)

order by 1,2,3;

 

 

Выводим имя таблицы, и имя колонок для всех ограничений типа внешний ключ

select uc.table_name,uc.constraint_name, ucc.column_name

from user_constraints uc left join user_cons_columns ucc

on uc.constraint_name = ucc.constraint_name

where uc.constraint_type = 'R'

Затем с помощью подзапроса мы выделяем те ограничения, по которым не построены индексы

select * from user_ind_columns uic

where ucc.column_name = uic.column_name

and ucc.table_name = uic.table_name

and ucc.position = uic.column_position

 

5. Используются таблицы схем HR и OE.

Данные об адресе покупателя хранятся в столбце CUST_ADDRESS таблицы CUSTOMERS.

Атрибут CUST_ADDRESS имеет пользовательский тип данных CUST_ADDRESS_TYP:

Имя поля Описание

-------------- -------------------------------------

STREET_ADDRESS – Название улицы

POSTAL_CODE - Почтовый индекс

CITY - Название города (населенного пункта)

STATE_PROVINCE – Код штата или региона

COUNTRY_ID - Код страны

Одной командой SELECT вывести сведения о покупателях, в адресе которых указано название города, имеющееся в списке городов, где расположены подразделения компании.

В результат вывести четыре столбца:

1. Идентификатор покупателя

2. Пол покупателя

3. Дата рождения покупателя

4. Название города (населенного пункта)

Результат отсортировать по идентификатору покупателя по возрастанию.

 

select c.customer_id,c.gender,c.date_of_birth

from oe.customers c inner join hr.locations l

on l.city=c.cust_address.city;

 

CUSTOMER_ID GENDER DATE_OF_BIRTH

----------- ------ -------------

326 F 06.09.59

327 M 15.09.56

328 F 06.10.85

333 M 16.10.53

334 M 15.11.81

344 M 14.03.60

481 F 28.09.67

731 M 02.10.33

757 M 21.12.53

846 F 14.06.62

712 M 05.06.83

713 F 24.06.48

715 F 05.07.51

717 M 25.07.74

719 M 04.08.62

721 M 23.08.44

727 M 02.09.49

729 M 23.09.42

756 M 02.12.86

981 M 07.10.73

Комментарий:

Соединяем таблицу customers с таблицей locations по равенству городов.

Получаем покупателей, которые живут в городах, где расположены подразделения компании.

 

6. Используются таблицы стандартных схем HR и OE.

Одной командой SELECT вывести сведения о сотрудниках компании, которые являются персональными менеджерами покупателей, с которыми работает компания.

В результат вывести пять столбцов:

1. Идентификатор сотрудника

2. Имя сотрудника

3. Фамилия сотрудника

4. Оклад, установленный сотруднику.

5. Установленный размер комиссионных (в процентах от оклада).

Результат отсортировать по идентификатору сотрудника по возрастанию.

 

select DISTINCT EMPLOYEES.employee_ID, EMPLOYEES.FIRST_NAME, EMPLOYEES.lAST_NAME, EMPLOYEES.SALARY, EMPLOYEES.COMMISSION_PCT

FROM OE.CUSTOMERS JOIN OE.EMPLOYEES

ON EMPLOYEE_ID=account_mgr_id

ORDER BY EMPLOYEE_ID

 

Комментарий:

Соединяем таблицу customers с таблицей employees по равенству employee_id=account_manager_id и получаем список персональных менеджеров

 

7. Используются таблицы стандартной схемы HR.

Месячный доход сотрудника складывается из оклада, установленного сотруднику, и установленного для сотрудника размера комиссионных (в процентах от оклада; например, значению 0,2 соответствует сумма комиссионных, равная 20% от оклада).

Если для сотрудника не указан размер комиссионных, то следует считать, что комиссионные данному сотруднику не выплачиваются.

Одной командой SELECT вывести сведения о месячном доходе сотрудников по странам.

В результат вывести два столбца:

1. Название страны, в которой расположено подразделение компании, к которому приписан сотрудник

2. Сумма месячных доходов сотрудников, приписанных к подразделениям компании, расположенных в данной стране.

Результат упорядочить по названиям стран по возрастанию.

В предпоследней строке вывести сумму месячных доходов сотрудников, для которых невозможно определить страну. Вместо названия страны в этой строке вывести строку 'N/A' (в верхнем регистре).


Дата добавления: 2015-08-18; просмотров: 277 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Main_Table PK User_Constraints 18 страница| Main_Table PK User_Constraints 20 страница

mybiblioteka.su - 2015-2024 год. (0.072 сек.)