sql помогите решить задание

Статус: Offline
Реєстрація: 10.04.2009
Повідом.: 21
sql помогите решить задание

CREATE TABLE DEPT ( -- Филиалы фирмы
DEPTNO NUMBER (2) NOT NULL, -- Номер филиала
DNAME VARCHAR2 (14), -- Название филиала
LOC VARCHAR2 (13), -- Город, в котором расположен филиал
CONSTRAINT DEPT_PRIMARY_KEY
PRIMARY KEY (DEPTNO)) ;

CREATE TABLE EMP ( -- Сотрудники
EMPNO NUMBER (4) NOT NULL, -- Табельный номер
ENAME VARCHAR2 (10), -- Фамилия
JOB VARCHAR2 (9), -- Должность
MGR NUMBER (4), -- Табельный номер руководителя
HIREDATE DATE, -- Дата приема на работу
SAL NUMBER (7,2), -- Заработная плата
DEPTNO NUMBER (2) NOT NULL, -- Номер филиала
CONSTRAINT EMP_PRIMARY_KEY
PRIMARY KEY (EMPNO) ) ;


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

# Вывести список всех филиалов с фамилиями руководителей (руководителем считается сотрудник, подчиняющийся работнику другого филиала или никому не подчиняющийся).

# Определить табельный номер для вновь принимаемого на работу сотрудника. Табельный номер определяется как минимальный «свободный».

# Вывести (для всех филиалов) список вида

|Наименование филиала | Самый высокооплачиваемый сотрудник |Самый низкооплачиваемый сотрудник|


# Увеличить заработную плату сотрудникам

* проработавшим более 5 лет — на 50%
* проработавшим более 3 лет — на 30%
* проработавшим более 2 лет — на 20%
* проработавшим более 1 года — на 10 грн.
* проработавшим менее 1 года — не увеличивать

буду очень благодарен

Вот что я смог набрать сам
Помогите плиз проверьте кто может


1


SELECT DEPT.DNAME, DEPT.LOC, COUNT(EMP.EMPNO) AS COUNTEMP

FROM DEPT, EMP
ORDER BY DEPT.LOC OR COUNTEMP
WHERE DEPT.NUMBER = EMP.NUMBER;

2

SELECT DEPT.DNAME, EMP.ENAME

FROM DEPT, EMP
WHERE MGR IS NULL
AND DEPT.NUMBER = EMP.NUMBER;

3

SELECT (MAX(EMP.EMPNO))+1 AS NEXTEMPNO

FROM DEPT, EMP
WHERE DEPT.NUMBER = EMP.NUMBER;


4


SELECT DEPT.DNAME, EMP.MAX(SAL), EMP.MIN(SAL)

FROM DEPT, EMP
GROUP BY DEPT.DNAME
WHERE DEPT.NUMBER = EMP.NUMBER;

5

SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL / .5
FROM DEPT, EMP
WHERE EMP.HIREDATE BETWEEN 1/12/2004 AND 1/12/2009
AND DEPT.NUMBER = EMP.NUMBER
UNION
SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL / .3
FROM DEPT, EMP
WHERE EMP.HIREDATE BETWEEN 1/12/2005 AND 1/12/2009
AND DEPT.NUMBER = EMP.NUMBER
UNION
SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL / .2
FROM DEPT, EMP
WHERE EMP.HIREDATE BETWEEN 1/12/2007 AND 1/12/2009
AND DEPT.NUMBER = EMP.NUMBER
UNION
SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL + 10
FROM DEPT, EMP
WHERE EMP.HIREDATE BETWEEN 1/12/2008 AND 1/12/2009
AND DEPT.NUMBER = EMP.NUMBER;
 
вначале where а потом order by или group by

# Увеличить заработную плату сотрудникам

* проработавшим более 5 лет — на 50%
update EMP
set SAL=SAL+(SAL/2)
WHERE HIREDATE BETWEEN 1/01/2005 AND 1/01/2009
 
1
- Филиалы без сотрудников не попадут в выборку.
- колонки с именем NUMBER нет ни в таблице DEPT ни в EMP

2
- не выполняется часть условия про "...руководителем считается сотрудник, подчиняющийся работнику другого филиала..."
- при таком связывании таблиц не попадут в выборку филиалы без сотрудников и соответственно руководителей
* в условии не четко определено, как обрабатывать ситуацию когда в филиале больше одного сотрудника подходящего под определение руководителя

3
* Условие можно трактовать как найти первый незанятый номер, а такой может быть и в нутри существующего порядка номеров.
Посилання видалено

4
- неправильный синтаксис: EMP.MAX(SAL), EMP.MIN(SAL)

5
- Срок службы сотрудника нанаятого 1/12/2008 явно лежит в пределах "BETWEEN 1/12/2004 AND 1/12/2009" и в тоже время определенно меньше 5 лет оговоренных в условии
- скорее всего, ожидается расчет относительно текущей даты, а не каких-то константных значений
 
Внес некоторые исправления


1


SELECT DEPT.DNAME, DEPT.LOC, COUNT(EMP.EMPNO) AS COUNTEMP

FROM DEPT, EMP
ORDER BY DEPT.LOC OR COUNTEMP
WHERE DEPT.DEPTNO = EMP.EMPNO;

2

SELECT DEPT.DNAME, EMP.ENAME

FROM DEPT, EMP
WHERE MGR IS NULL
AND DEPT.DEPTNO = EMP.EMPNO;

3

SELECT (MAX(EMP.EMPNO))+1 AS NEXTEMPNO

FROM DEPT, EMP
WHERE DEPT.DEPTNO = EMP.EMPNO;


4


SELECT DEPT.DNAME, MAX(EMP.SAL), MIN(EMP.SAL)

FROM DEPT, EMP
GROUP BY DEPT.DNAME
WHERE DEPT.DEPTNO = EMP.EMPNO;

5

SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL / 1.5
FROM DEPT, EMP
WHERE EMP.HIREDATE < 1/12/2004
AND DEPT.DEPTNO = EMP.EMPNO
UNION
SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL / 1.3
FROM DEPT, EMP
WHERE EMP.HIREDATE < 1/12/2005
AND DEPT.DEPTNO = EMP.EMPNO
UNION
SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL / 1.2
FROM DEPT, EMP
WHERE EMP.HIREDATE < 1/12/2007
AND DEPT.DEPTNO = EMP.EMPNO
UNION
SELECT EMP.ENAME, EMP.HIREDATE, EMP.SAL, EMP.SAL + 10
FROM DEPT, EMP
WHERE EMP.HIREDATE < 1/12/2008
AND DEPT.DEPTNO = EMP.EMPNO;
 
Останнє редагування:
попробуйте создать тестовую базу данных, наполнить ее данными и попробовать повыполнять ваши запросы, так вы отсеете хотя бы синтаксические ошибки.

1
- Неправильный синтаксис: ORDER BY DEPT.LOC OR COUNTEMP
- Очень низкая вероятность, что для большинства сотрудников их учетный номер будет совпадать с номером департмента



5
- Сотрудник с датой приема 1/12/2003 попадет во все варианты
- деление на 0.5 эквивалентно умножению на 2, а не на 1.5 как в условии задания

З.Ы. Без обид, но если это тестовое задание при приеме на работу, то я бы вас не взял.
 
Нечего обижаться. Особенно если учитывать что на разбор sql потратил пару дней=)
 
обязательно сделайте себе тестовую базу! на бумажке далеко не продвинитесь...
 
З.Ы. Без обид, но если это тестовое задание при приеме на работу, то я бы вас не взял.

Я даже догадываюсь, куда это тестовое задание... :)))

Gim2009, а случайно там ещё "опыт работы с Oracle9i" не требуется?
 
# Увеличить заработную плату сотрудникам
тут скорее всего Update, а не Select.
А остальное без студии влом на бумажке вникать.
 
Назад
Зверху Знизу