Subiect 1
Sa se afiseze in ordinea datei de angajare, crescator, cei mai vechi 10 angajati din departamentul care are cei mai multi angajati cu data de angajare inainte de o data introdusa de la tastatura. Se vor afisa coloanele: Numele complet, Departamentul si Vechimea (exprimata in luni).
select * from (select e.first_name||' '||last_name "Nume complet",d.department_name "Departament",round(months_between(sysdate,e.hire_date)) "Vechime"
from hr.employees e, HR.departments d,(select * from (select department_id,count(*) ct from hr.employees ex where ex.hire_date<'&&threshold' group by department_id order by ct desc) where rownum=1) g
where
d.department_id=e.department_id and
d.department_id=g.department_id
order by e.hire_date asc) where rownum<11
Subiect 2
Sa se afiseze, pentru fiecare departament, cei mai bine platiti 5 angajati, in ordine descrescatoare a salariului. De asemenea, sa se afiseze o linie de sumar dupa fiecare departament, cu suma salariilor celor 5 angajati din top. Coloanele afisate sunt Denumire Departament, Nume Complet Angajat, Salariu
COLUMN CD HEADING 'Departament'
COLUMN NUM HEADING 'Nume angajat'
COLUMN SAL HEADING 'Salariu'
BREAK ON CD SKIP 1
COMPUTE AVG OF SAL ON CD
SELECT D.DEPARTMENT_NAME CD , E.FIRST_NAME||' '||E.LAST_NAME NUM, E.SALARY SAL
FROM HR.DEPARTMENTS D, HR.EMPLOYEES E
WHERE D.DEPARTMENT_ID=E.DEPARTMENT_ID
AND (SELECT COUNT(*) FROM HR.EMPLOYEES EX WHERE EX.SALARY>E.SALARY AND EX.DEPARTMENT_ID=E.DEPARTMENT_ID)<5
ORDER BY CD ASC, SAL DESC
Subiect 3
Sa se afiseze suma salariilor din fiecare departament, ordonate dupa numarul de sefi din departamentul respectiv. Se vor afisa coloanele: Denumire Departament, Suma Salarii, Numar Sefi, Numarul de persoane care nu sunt Sefi.
SELECT D.DEPARTMENT_NAME "Nume departament", G.SAL "Total salarii", H.CT "Numar sefi", L.CT "Numar non-sefi"
FROM HR.DEPARTMENTS D,
(SELECT DEPARTMENT_ID, SUM(EX.SALARY) SAL FROM HR.EMPLOYEES EX GROUP BY EX.DEPARTMENT_ID) G,
(SELECT DEPARTMENT_ID, COUNT(*) CT FROM HR.EMPLOYEES EXX WHERE EXISTS(SELECT * FROM HR.EMPLOYEES EXXX WHERE EXXX.MANAGER_ID=EXX.EMPLOYEE_ID) GROUP BY EXX.DEPARTMENT_ID) H,
(SELECT DEPARTMENT_ID, COUNT(*) CT FROM HR.EMPLOYEES EXX WHERE NOT EXISTS(SELECT * FROM HR.EMPLOYEES EXXX WHERE EXXX.MANAGER_ID=EXX.EMPLOYEE_ID) GROUP BY EXX.DEPARTMENT_ID) L
WHERE D.DEPARTMENT_ID=G.DEPARTMENT_ID
AND D.DEPARTMENT_ID=H.DEPARTMENT_ID
AND D.DEPARTMENT_ID=L.DEPARTMENT_ID
Subiect 4
Pentru un anumit job introdus de la tastatura, sa se afiseze, pentru fiecare departament in care e prezent, Denumirea departamentului, Numarul de salariati cu jobul respectiv, Salariul total, Salariul mediu, Data angajarii celui mai vechi angajat si Vechimea medie (exprimata in luni).
Subiect 5
Sa se afiseze cei mai bine platiti 3 angajati din fiecare departament si cei mai prost platiti 3 angajati, in ordine descrescatoare ( salariu mediu pe departament, salariu). Coloanele afisate sunt: Nume departament, Nume complet angajat, Salariu, Diferenta fata de salariul mediu pe departament (+/-) Sa se afiseze de asemenea o linie de sumar cu salariul mediu pe departamentul respectiv.
SELECT D.DEPARTMENT_NAME "Nume departament",E.FIRST_NAME||' '||E.LAST_NAME "Nume angajat",E.salary "Salariu",E.salary-(select avg(exx.salary) from hr.employees exx where exx.department_id=e.department_id) "Diferenta"
FROM HR.DEPARTMENTS D, HR.EMPLOYEES E
WHERE D.DEPARTMENT_ID=E.DEPARTMENT_ID AND
((SELECT COUNT (*) FROM HR.EMPLOYEES EX WHERE EX.SALARY > E.SALARY AND EX.DEPARTMENT_ID=E.DEPARTMENT_ID)<3 OR
(SELECT COUNT(*) FROM HR.EMPLOYEES EX WHERE EX.SALARY < E.SALARY AND EX.DEPARTMENT_ID=E.DEPARTMENT_ID)<3)
order by e.department_id, e.salary desc
0 comentarii:
Trimiteți un comentariu