Créer les 2 tables ci dessous :
DROP TABLE IF EXISTS TD_EMPLOYE,TD_DEPARTEMENT;
CREATE TABLE TD_DEPARTEMENT (
INT,
idDept VARCHAR(255),
nom VARCHAR(255),
lieu PRIMARY KEY(idDept)
);
INSERT INTO TD_DEPARTEMENT (idDept,nom,lieu) VALUES (10,"recherche","Besançon");
INSERT INTO TD_DEPARTEMENT (idDept,nom,lieu) VALUES (20,"vente","Montbéliard");
INSERT INTO TD_DEPARTEMENT (idDept,nom,lieu) VALUES (30,"direction","Belfort");
INSERT INTO TD_DEPARTEMENT (idDept,nom,lieu) VALUES (40,"fabrication","Sochaux");
CREATE TABLE TD_EMPLOYE (
INT,
idEmploye VARCHAR(255),
nom VARCHAR(255),
fonction INT,
idResponsable date,
date_embauche NUMERIC(8,2),
salaire NUMERIC(8,2),
prime INT,
departement_id PRIMARY KEY(idEmploye)
);INSERT INTO TD_EMPLOYE(nom,idEmploye,fonction,idResponsable,date_embauche,salaire,prime,departement_id) VALUES
'MARTIN',16712,'directeur',25717,'2000-05-23',8000,NULL,30);
(INSERT INTO TD_EMPLOYE(nom,idEmploye,fonction,idResponsable,date_embauche,salaire,prime,departement_id) VALUES
'DUPONT',17574,'administratif',16712,'2005-05-03',1800,NULL,30),
('DUPOND',26691,'commercial',27047,'1998-04-04',5000,500,20),
('LAMBERT',25012,'administratif',27047,'2001-03-14',NULL,2400,20),
('JOUBERT',25717,'president',NULL,'1992-08-10',10000,NULL,30),
('LEBRETON',16034,'commercial',27047,'2001-06-01',3000,0,20),
('MARTIN',17147,'commercial',27047,'2005-05-03',4000,500,20),
('PAQUEL',27546,'commercial',27047,'1993-09-03',4400,1000,20),
('LEFEBVRE',25935,'commercial',27047,'1994-01-11',4700,400,20),
('GARDARIN',15155,'ingenieur',24533,'1995-03-22',4800,NULL,10),
('SIMON',26834,'ingenieur',24533,'1998-10-04',4000,NULL,10),
('DELOBEL',16278,'ingenieur',24533,'2004-11-16',4200,NULL,10),
('ADIBA',25067,'ingenieur',24533,'1997-10-05',6000,NULL,10),
('CODD',24533,'directeur',25717,'1985-11-12',11000,NULL,10),
('LAMERE',27047,'directeur',25717,'1999-09-07',9000,NULL,20),
('BALIN',17232,'administratif',24533,'1997-10-03',2700,NULL,10),
('BARA',24831,'administratif',16712,'1998-11-10',3000,NULL,30),
('toto','00001','livreur de pizzas',NULL,NULL,NULL,NULL,NULL); (
WITH
WITH department_names AS (
SELECT idEmploye, nom AS employee_name, departement_id
FROM TD_EMPLOYE
),AS (
employee_departments SELECT dn.employee_name, d.nom
FROM department_names dn
JOIN TD_DEPARTEMENT d ON dn.departement_id = d.idDept
)SELECT * FROM employee_departments;
WITH RECURSIVE employee_hierarchy AS (
SELECT idEmploye, nom, idResponsable, 0 AS level
FROM TD_EMPLOYE
WHERE idResponsable IS NULL -- Sélectionner le PDG (manager_id NULL)
UNION ALL
SELECT e.idEmploye, e.nom, e.idResponsable, eh.level + 1
FROM TD_EMPLOYE AS e
JOIN employee_hierarchy AS eh ON e.idResponsable = eh.idEmploye
)SELECT idEmploye, nom, idResponsable, level
FROM employee_hierarchy;
Affichage des employés et de la somme des salaires
SELECT SUM(salaire)
FROM TD_EMPLOYE;
SELECT *, SUM(salaire) OVER()
FROM TD_EMPLOYE;
Affichage des employés et de la somme des salaires par fonctions ou départements
SELECT *
SUM(salaire) OVER(PARTITION BY fonction)
, FROM TD_EMPLOYE;
SELECT *
SUM(salaire) OVER(PARTITION BY departement_id)
, FROM TD_EMPLOYE;
Affichage avec ROW_NUMBER (retourne le numéro dans la partition (fenêtre))
SELECT idEmploye, nom, idResponsable, salaire, prime, departement_id -- , fonction, date_embauche
SUM(salaire) OVER(PARTITION BY departement_id)
, ROW_NUMBER() OVER (PARTITION BY departement_id )
, FROM TD_EMPLOYE;
SELECT idEmploye, nom, idResponsable, salaire, prime, departement_id , fonction -- , date_embauche
SUM(salaire) OVER(PARTITION BY departement_id) AS calcul_sum_part_dep
, ROW_NUMBER() OVER (PARTITION BY departement_id ORDER BY nom DESC ) AS position_sum_part_dep
, FROM TD_EMPLOYE;
SELECT idEmploye, nom, idResponsable, salaire, prime, departement_id , fonction -- , date_embauche
SUM(salaire) OVER(PARTITION BY fonction) AS calcul_sum_part_dep
, ROW_NUMBER() OVER (PARTITION BY fonction ORDER BY salaire DESC ) AS position_sum_part_dep
, RANK() OVER (PARTITION BY fonction ORDER BY salaire DESC ) AS rang_sum_part_dep
, FROM TD_EMPLOYE;
SELECT
idEmploye,
nom,
fonction,
idResponsable,
date_embauche,
salaire,
prime,
departement_id,ROW_NUMBER() OVER (PARTITION BY departement_id ORDER BY salaire DESC) AS salary_rank_number,
RANK() OVER (PARTITION BY departement_id ORDER BY salaire DESC) AS salary_rank
FROM
TD_EMPLOYE;
WITH RankedEmployees AS (
SELECT
idEmploye,
nom,
fonction,
idResponsable,
date_embauche,
salaire,
prime,
departement_id,ROW_NUMBER() OVER (PARTITION BY departement_id ORDER BY salaire DESC) AS salary_rank
FROM
TD_EMPLOYE
)SELECT
idEmploye,
nom,
fonction,
idResponsable,
date_embauche,
salaire,
prime,
departement_idFROM
RankedEmployeesWHERE
<= 2; salary_rank