Está en la página 1de 4

1.

Sa se scrie o cerere care face o lista cu toti sefii de


departament care au cel putin 2 subalterni cu o vechime mai mare de 20
de ani in companie.

create table emp (id number(2) primary key, nume varchar2(30), dept number(2),
vechime number(2));
insert into emp values ( 1, 'popescu', 10, 15);
insert into emp values ( 2, 'vasile', 10, 25);
insert into emp values ( 3, 'dumitru', 20, 3);
insert into emp values ( 4, 'ionel', 10, 21);
insert into emp values ( 5, 'angela', 20, 6);

create table dept (id number(2) primary key, id_sef number(2) references emp(id));
insert into dept values (10, 1);
insert into dept values (20, 5);

select DISTINCT a.nume from emp a, dept b, emp c


where b.id_sef = a.id AND c.dept = b.id AND c.vechime > 20;

Rezultat: popescu

2. Să se scrie o cerere sql care face o listă cu șefii de departament care au cei mai
mulți angajați care nu au primit niciun comision.

alter table emp add comision number(2);


insert into emp values (6, 'costin', 10, 12, 10);
insert into emp values (7, 'cosmina' , 30, 5, 5);
insert into dept values ( 30, 7);

create table raport as (


select d.id_sef sef, s.dep dep, s.cnt contor from dept d,
(select DISTINCT e.dept dep, count(e.id) cnt
from emp e
where e.comision is null
group by e.dept) s
where d.id = s.dep);

select r.dep Nr_dep, e.nume, r.contor angajati


from raport r, emp e
where e.id = r.sef AND r.contor = ( select max(contor) from raport );

Rezultat: popescu
3. Sa se scrie o cerere care face o lista cu distribuitia angajatilor pe grupe de
salarizare:
grupa 1 - salariatii cu sal mai mici de 1500
grupa 2 – sal mai mari de 1500
Antet: denumire departament, nume, ani vechime, luni vechime, grupa salarizare

create table angajati (


nume varchar2(30),
data_ang date,
salariu number(4),
dep number(2)
);

insert into angajati values ('shakuka', '10-APR-10', 1900, 10);


insert into angajati values ('johny', '01-MAR-11', 2600, 10);
insert into angajati values (samir', '01-SEP-01' 1400, 20);
insert into angajati values ('habiba', '1-JAN-08', 1000, 20);

select dep, nume, (sysdate-data_ang)/365 ani_vechime,


months_between(sysdate, data_ang) luni_vechime, '1' grupa
from angajati
where salariu < 1500
UNION
select dep, nume, (sysdate-data_ang)/365 ani_vechime,
months_between(sysdate, data_ang) luni_vechime, '2' grupa
from angajati
where salariu >= 1500;

4. Sa se scrie o cerere care face o lista cu angajatii care au venituri (sal + comm) mai
mici decat venitul sefului direct si vechimea mai mare decat vechimea presedintelui
companiei (calculata in ani).
Antet: nume_subaltern, venit_subaltern, an_vechime_subaltern, nume_sef,
venit_sef, an_vechime_presedinte

(folosind tabelele definite si alterate anterior)


(presedintele va avea ID=1)

alter table emp add salariu number(3);


update emp set salariu = 800 where id=1;
update emp set salariu = 500 where id=2;
update emp set salariu = 300 where id=3;
update emp set salariu = 700 where id=4;
update emp set salariu = 400 where id=5;
update emp set salariu = 400 where id=6;
update emp set salariu = 400 where id=7;

select a.nume, a.salariu * (1+nvl(a.comision,0)) venit, a.vechime vechime, b.nume sef,


c.vechime vechime_pres
from emp a, emp b, emp c, dept d
where c.id = 1 AND b.id = d.id_sef AND d.id = a.dept ;

select a.nume, a.salariu * (1+nvl(a.comision,0)) venit, a.vechime vechime, b.nume sef,


b.salariu * (1+nvl(b.comision,0)) venit_sef, c.vechime vechime_pres
from emp a, emp b, emp c, dept d
where c.id = 1 AND b.id = d.id_sef AND d.id = a.dept
AND b.salariu * (1+nvl(b.comision,0)) > a.salariu * (1+nvl(a.comision,0)) AND
a.vechime > c.vechime;

Rezultat: subalternii sunt Vasile si Ionel

5. O cerere sql care sa listeze angajatii care au salariul mai mare decat salariul
mediu pe departamentul din care fac parte, dar numai din departamentul cu cele
mai multe salarii peste salariul mediu pe departament.

Rezultatul pe tabela emp: Popescu, Ionel.

Intai scriu media pe fiecare departament:


select avg(salariu) avg, dept d
from emp
group by dept;

Pe urma scriu toti angajatii care au salariu mai mare decat aceste medii, pe departamente:
create table tt as (
select DISTINCT a.nume, a.dept, t.avg
from emp a,
(select avg(salariu) avg, dept d
from emp
group by dept) t
where a.salariu > t.avg AND a.dept = t.d);
select * from tt;

In final, dintre acestia ii aleg pe cei care apartin departamentului cu cele mai multe intrari
(in tabelul creat anterior).

Selectarea departamentului cu cel mai mare nr de angajati se face:


select count(dept), dept
from tt
having count(dept) = ( select max(count(dept)) from tt group by dept )
group by dept;

In fine:
select DISTINCT a.nume
from emp a, tt,
(select count(dept) C, dept D
from tt
having count(dept) = ( select max(count(dept)) from tt group by dept )
group by dept) new
where a.dept = new.D AND tt.avg < a.salariu AND tt.dept = new.D;

También podría gustarte