Sunteți pe pagina 1din 16

Universitatea „Babes-Bolyai” Cluj-Napoca

Facultatea de Stiinte Economice si Gestiunea Afacerilor

GESTIUNEA PERSONALULUI

Proiect la
BAZE DE DATE IN ECONOMIE

Pascalau Damian-Stefan
IE ID, an 2, gr 2
2020

1
Scenariu
Am realizat acest proiect pentru a surprinde activitatea legata de gestiunea personalului din cadrul
unei organizatii de tip fabrica cu o singura filiala. Organigrama prevede 5 departamente:

- Conducere
- Vanzari
- Productie
- Resurse Umane
- Economic

si 8 tipuri de posturi:

- CEO
- Asistent
- Director departament
- Sef de linie
- Muncitor calificat
- Muncitor necalificat
- Angajat incepator
- Angajat senior

Informatia legata de departamente este pastrata in tabela departamente, cu campurile


id_departament (conditionat ca obligatoriu si unic la fiecare inserare), nume_departament.

Intr-un mod similar, informatia legata de posturi este pastrata intr-un tabel separat numit
posturi, cu campurile id_post (conditionat ca obligatoriu si unic la fiecare inserare), nume_post. Am
organizat informatia despre posturi in tabel astfel incat sa contina un barem minim si maxim
recomandat legat de salariul pe care il oferim pentru fiecare post. Aceasta informatie se afla sub
coloanele salariu_min si salariu_max. Aceste valori nu impun conditionari ci servesc functia de
etalon la negocierea salariala. Aceste valori pot fi de asemenea folosite si la generarea unor rapoarte
legate de costurile organizatiei cu salariile oferite angajatilor.

De asemenea, pentru gestiunea personalului am creat tabela personal unde, pentru fiecare
angajat, trebuie introduse date in coloanele cnp_angajat, nume, prenume, data_angajare_pe_post,
id_post, id_departament si salariu. Folosim CNPul angajatului ca si cheie primara cu ajutorul careia
identificam angajatii.

Tot in tabela personal pot fi salvate informatii de contact importante precum numarul de telefon
si adresa de email, dar care nu sunt obligatorii.

Acest proiect permite documentarea istoricului personalului, precum functiile ocupate in trecut
in organizatie: tabela istoric_personal contine data la care a inceput angajatul sa lucreze pe un anume
post (data_start) si data la care a avansat pe alt post sau a parasit compania(data_sfarsit), pe langa
cnp_angajat, id_post si id_departament care sunt tratate ca si chei straine. Toate campurile acestei
tabele sunt obligatorii.

2
Diagrama ERD

Tabelele de mapare

ANGAJAŢI
Tip cheie Opţionalitate Nume coloană Observaţii
CP * Cnp_angajat Obligatoriu, cheie primara
* nume Obligatoriu
* prenume Obligatoriu
O email Optional
O telefon Optional
* data_angajare_pe_post Obligatoriu
CS * id_post Obligatoriu, cheie in relatia cu POSTURI
CS * id_departament Obligatoriu, cheie in relatia cu DEPARTAMENTE
* salariu Obligatoriu
POSTURI
Tip cheie Opţionalitate Nume coloană Observaţii
CP * id_post Obligatoriu, cheie primara
O nume_post Optional
O salariu_min Optional
O salariu_max Optional

3
DEPARTAMENTE
Tip cheie Opţionalitate Nume coloană Observaţii
CP * id_departament Obligatoriu, cheie primara
O nume_post Optional

ISTORIC_ANGAJATI
Tip cheie Opţionalitate Nume coloană Observaţii
CS * cnp_angajat Obligatoriu, cheie in relatia cu ANGAJATI

* data_start Obligatoriu

* data_sfarsit Obligatoriu

CS * id_post Obligatoriu, cheie in relatia cu POSTURI

CS * id_departament Obligatoriu, cheie in relatia cu DEPARTAMENTE

Schema bazei de date normalizată


Initial toate coloanele erau continute in tabela angajati. Normalizarea
bazei de date s-a facut prin faptul ca datele despre posturi si departamente s-au
mutat in tabele separate. De asemenea si istoricul angajatilor s-a mutat in tabela
istoric_angajat.

4
Constrângeri legate de câmpuri
In tabela angajati, CNP-ul angajatilor este unic si obligatoriu, el serveste
la identificarea salariatilor, si poate fi de maxim 13 cifre. La datelor inserarea in
BD, trebuie specificate valori si pentru campurile: nume, prenume,
data_angajare_pe_post, id_post, id_departament, salariu. Id_post si
id_departament sunt chei straine care trebuie sa existe deja in posturi, respectiv
in departamente.
In tabela posturi nu pot exista doua posturi cu acelasi id, si campul nu
poate fi lasat gol la inserarea in BD. Un id post poate lua valori intre 0 si 999.
In tabela departamente nu pot exista doua departamente cu acelasi id, si
campul nu poate fi lasat gol la inserarea in BD. Un id post poate lua valori intre
0 si 999.
In tabela istoric_angajat pot fi introduse valori care deja exista in posturi,
departamente, si angajati, fiind legate prin chei straine campurile cnp_angajat,
id_post, id_departament.

Implementarea bazei de date în OAE


Creare tabele
--creaza tabela posturi
CREATE TABLE POSTURI
("ID_POST" NUMBER(3,0)NOT NULL ENABLE,
"NUME_POST" VARCHAR2(40),
"SALARIU_MIN" NUMBER(10,2),
"SALARIU_MAX" NUMBER(10,2),
CONSTRAINT "POSIDPOS" PRIMARY KEY ("ID_POST")
USING INDEX ENABLE
);

--creaza tabela departamente


CREATE TABLE DEPARTAMENTE
("ID_DEPARTAMENT" NUMBER(3,0) NOT NULL ENABLE,
"NUME_DEPARTAMENT" VARCHAR2(40),
CONSTRAINT "DEPIDDEP" PRIMARY KEY ("ID_DEPARTAMENT")
USING INDEX ENABLE
);

--creaza tabela angajati


CREATE TABLE ANGAJATI
("CNP_ANGAJAT" NUMBER(13,0),
5
"PRENUME" VARCHAR2(45) NOT NULL ENABLE,
"NUME" VARCHAR2(30) NOT NULL ENABLE,
"EMAIL" VARCHAR2(50),
"TELEFON" VARCHAR2(20),
"DATA_ANGAJARE_PE_POST" DATE CONSTRAINT "ANGDATAANG_NN" NOT NULL ENABLE,
"ID_POST" NUMBER(3,0) NOT NULL ENABLE,
"ID_DEPARTAMENT" NUMBER(3,0) NOT NULL ENABLE,
"SALARIU" NUMBER(10,2) NOT NULL ENABLE,
CONSTRAINT "ANG_ID_DEP_DEP_FK1" FOREIGN KEY ("ID_DEPARTAMENT") REFERENCES
DEPARTAMENTE ("ID_DEPARTAMENT"),
CONSTRAINT "ANGCNP_PK" PRIMARY KEY ("CNP_ANGAJAT")
USING INDEX ENABLE
);

--Modificari structura
-- adauga foreign key id_post in tabela angajati
ALTER TABLE ANGAJATI ADD CONSTRAINT "ANG_ID_POS_POS_FK1" FOREIGN KEY
("ID_POST") REFERENCES POSTURI ("ID_POST");

--creaza tabela istoric_angajati


CREATE TABLE ISTORIC_ANGAJATI
("CNP_ANGAJAT" NUMBER(13,0) NOT NULL ENABLE,
"DATA_START" DATE NOT NULL ENABLE,
"DATA_SFARSIT" DATE NOT NULL ENABLE,
"ID_POST" NUMBER(3,0) NOT NULL ENABLE,
"ID_DEPARTAMENT" NUMBER(3,0) NOT NULL ENABLE
);

--Modificari structura
-- adauga foreign key cnp_angajat in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_CNPANG_ANG_FK1" FOREIGN KEY
("CNP_ANGAJAT") REFERENCES ANGAJATI ("CNP_ANGAJAT");
-- adauga foreign key id_post in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_ID_POS_POS_FK1" FOREIGN KEY
("ID_POST") REFERENCES POSTURI ("ID_POST");
-- adauga foreign key id_departament in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_ID_DEP_DEP_FK1" FOREIGN KEY
("ID_DEPARTAMENT") REFERENCES DEPARTAMENTE ("ID_DEPARTAMENT");

Popularea tabelelor

-- populeaza tabelele cu date


--posturi
6
INSERT INTO POSTURI
VALUES (1, 'CEO', 10000.0, 20000.0);
INSERT INTO POSTURI
VALUES (2, 'Asistent', 2000.0, 10000.0);
INSERT INTO POSTURI
VALUES (3, 'Director Departament', 6000.0, 30000.0);
INSERT INTO POSTURI
VALUES (4, 'Sef de linie', 3000.0, 8000.0);
INSERT INTO POSTURI
VALUES (5, 'Muncitor calificat', 2000.0, 6000.0);
INSERT INTO POSTURI
VALUES (6, 'Muncitor necalificat', 1000.0, 4000.0);
INSERT INTO POSTURI
VALUES (7, 'Angajat Incepator', 1000.0, 4000.0);
INSERT INTO POSTURI
VALUES (8, 'Angajat Senior', 3500.0, 9500.0);
--departamente
INSERT INTO DEPARTAMENTE
VALUES (1,'Conducere');
INSERT INTO DEPARTAMENTE
VALUES(2, 'Vanzari');
INSERT INTO DEPARTAMENTE
VALUES(3, 'Productie');
INSERT INTO DEPARTAMENTE
VALUES(4, 'Resurse Umane');
INSERT INTO DEPARTAMENTE
VALUES(5, 'Economic');
INSERT INTO DEPARTAMENTE
VALUES(6, 'Vanzari');
--angajati
INSERT INTO ANGAJATI
VALUES (2921112201262,'Andreea-Gabriela', 'Pascalau', 'andreea@mail.com',
'712345678', '02/Jan/2020', 2, 2, 4500.67);
INSERT INTO ANGAJATI
VALUES (1731112205562,'Damian', 'Pascalau', 'dami@mail.com', '6541323512',
'28/Jan/2014', 1, 1, 18145.7);
INSERT INTO ANGAJATI
VALUES (291112201112,'Andreea', 'Ionescu', 'andreeaionescu@mail.com',
'54654131', '09/Jun/2017', 3, 5, 10000.0);
INSERT INTO ANGAJATI
VALUES (2921962208562,'Gabriela', 'Pascalescu', 'gabby@mail.com', '23165412',
'02/Jan/2020', 4, 3, 4900.23);
INSERT INTO ANGAJATI
VALUES (2861212205322,'Ana-Gabriela', 'Popescu', 'anna@mail.com', '132122',
'02/Jan/2020', 3, 2, 7300.36);
7
INSERT INTO ANGAJATI
VALUES (1852212205563,'Mihai-Ion', 'Mihailescu', 'mitza@mail.com', '645312',
'14/Nov/2016', 2, 4, 2800.75);
INSERT INTO ANGAJATI
VALUES (1941111209992,'Denis', 'Marinescu', 'denism@mail.com', '654312',
'30/Jan/2020', 7, 5, 2000.00);
INSERT INTO ANGAJATI
VALUES (1781112205123,'Andreei', 'Cosma', 'andreic@mail.com', '89653216541',
'12/Aug/2014', 5, 3, 3300.67);
INSERT INTO ANGAJATI
VALUES (2982111278562,'Monica', 'Cosma', 'monica@mail.com', '65412635412',
'02/Jan/2020', 5, 3, 2700.00);
INSERT INTO ANGAJATI
VALUES (1771112205123,'Ovidiu', 'Gheorghiu', 'andreic@mail.com', '53416354',
'12/Aug/2014', 5, 3, 2800.33);
INSERT INTO ANGAJATI
VALUES (2782222278562,'Alina', 'Ionescu', 'alinutsa@mail.com', '5742653412525',
'02/Jan/2020', 6, 3, 1700.12);
INSERT INTO ANGAJATI
VALUES (1921113205787,'Stefan', 'Petrescu', 'sfety@mail.com', '6854126351',
'02/Jan/2020', 8, 4, 4900.00);
--istoric angajati
INSERT INTO ISTORIC_ANGAJATI
VALUES (1921113205787,'02/Jan/2019', '01/Jan/2020', 7, 4);
INSERT INTO ISTORIC_ANGAJATI
VALUES (2921962208562,'02/Jan/2017', '01/Jan/2020', 5, 3);
INSERT INTO ISTORIC_ANGAJATI
VALUES (2921962208562,'23/Feb/2016', '01/Jan/2017', 6, 3);
INSERT INTO ISTORIC_ANGAJATI
VALUES (2861212205322,'18/Sep/2016', '01/Jan/2020', 2, 2);
INSERT INTO ISTORIC_ANGAJATI
VALUES (2921112201262,'12/Sep/2018', '27/Jan/2019', 7, 2);
INSERT INTO ISTORIC_ANGAJATI
VALUES (2921112201262,'28/Jan/2019', '01/Jan/2019', 8, 2);

8
9
Modificări de structură
1. La tabela angajaţi am adaugat constrângerea de tip cheie străină pe
atributul id_post.
-- adauga foreign key id_post in tabela angajati
ALTER TABLE ANGAJATI ADD CONSTRAINT "ANG_ID_POS_POS_FK1" FOREIGN KEY
("ID_POST") REFERENCES POSTURI ("ID_POST");

2. La tabela istoric_angajati am adaugat constrângerea de tip cheie străină


pe atributul cnp_angajat.
-- adauga foreign key cnp_angajat in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_CNPANG_ANG_FK1" FOREIGN KEY
("CNP_ANGAJAT") REFERENCES ANGAJATI ("CNP_ANGAJAT");

3. La tabela istoric_angajati am adaugat constrângerea de tip cheie străină


pe atributul id_post.
-- adauga foreign key id_post in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_ID_POS_POS_FK1" FOREIGN KEY
("ID_POST") REFERENCES POSTURI ("ID_POST");

4. La tabela istoric_angajati am adaugat constrângerea de tip cheie străină


pe atributul id_departament.
-- adauga foreign key id_departament in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_ID_DEP_DEP_FK1" FOREIGN KEY
("ID_DEPARTAMENT") REFERENCES DEPARTAMENTE ("ID_DEPARTAMENT");
10
Modificări de conţinut

1. Se modifică numarul de telefon al angajatului cu cnp ‚2921112201262’.


--actualizeaza numarul de telefon al unui angajat identificat dupa cnp
UPDATE ANGAJATI SET telefon='0745454545' where cnp_angajat=2921112201262;

2. Se actualizeaza numele dupa casatorie al angajatului cu cnp


‚2861212205322.
--actualizeaza numele dupa casatorie al doamnei identificata dupa cnp
update angajati SET nume='Mihailescu' where cnp_angajat=2861212205322;

3. Se şterge dublura introdusa eronat a departamentului vanzari, identificata


dupa id-ul unic 6.
--Sterge dublura departamentului vanzari cu ID departament 6
delete from departamente where id_departament=6;

11
Interogări

1. Să se afişeze numele si prenumele tuturor angajatilor


--afiseaza numele si prenumele tuturor angajatilor
SELECT nume, prenume FROM angajati;

2. Să se afişeze numele tuturor departamentelor existente


--afiseaza toate departamentele
SELECT nume_departament FROM departamente;

3. Să se afişeze numele tuturor posturilor existente


--afiseaza toate posturile existente
SELECT nume_post FROM posturi;

12
4. Să se afişeze numele si prenumele tuturor angajatilor care sunt noi pe post
in anul 2020
--afiseaza toti angajatii noi pe post in 2020
SELECT nume, prenume from angajati where DATA_ANGAJARE_PE_POST>'01-JAN-2020';

5. Să se afişeze costurile cu salariile pe fiecare departament, ordonate


descrescator dupa cost.
-- afiseaza costurile cu salariile pe fiecare departament, ordonate descrescator dupa cost
select id_departament, sum(salariu) from angajati group by id_departament order by
sum(salariu) desc;

13
6. Să se afişeze numele si prenumele tuturor angajatilor din departamentul
de productie, descrescator dupa salariu
-- afiseaza nume prenume si salariul angajatilor din departamentul de productie, aranjat
descrescator dupa salariu
select nume, prenume, salariu from angajati where id_departament=3 order by salariu desc;

7. Să se afişeze numele, prenumele, postul si departamentul tuturor


angajatilor, ordonate dupa numele postului
--join: afiseaza pentru toti angajatii: nume, prenume, post, departament ordonate dupa
numele postului
select a.nume, a.prenume, c.nume_post as post, b.nume_departament as departament
from angajati a
join departamente b on b.id_departament = a.id_departament
join posturi c on c.id_post= a.id_post
order by c.nume_post;

14
8. Să se afişeze numele, prenumele, postul si departamentul, de asemenea
data de start si de sfarsit a tuturor angajatilor din istoric angajati, ordonat
dupa nume.
-- join: afiseaza nume, prenume, post, departament, din data, pana la data pentru toti
angajatii din istoric_angajati, ordonati dupa nume
select a.nume, a.prenume, c.nume_post as post, b.nume_departament as departament,
d.data_start as "din data", d.data_sfarsit as "pana la data"
from angajati a
join departamente b on b.id_departament = a.id_departament
join posturi c on c.id_post= a.id_post
join istoric_angajati d on d.cnp_angajat = a.cnp_angajat
order by a.nume;

9. Să se afişeze numele si prenumele tuturor angajatilor care au modficari de


post sau departament in istoricul angajatilor.
--join:afiseaza numele si prenumele tuturor angajatilor cu modificari de post sau
departament
select a.nume, a.prenume
from angajati a
join istoric_angajati b on b.cnp_angajat = a.cnp_angajat;

15
16

S-ar putea să vă placă și