Je dois écrire une requête qui retourne tous les employés des départements avec un salaire moyen inférieur à 12 000. J'ai écrit cette requête
SELECT DEPARTMENT_ID, FIRST_NAME, LAST_NAME FROM EMPLOYEES GROUP BY DEPARTMENT_ID,FIRST_NAME,LAST_NAME HAVING AVG(SALARY) < 12000 ORDER BY LAST_NAME ASC;
4 Réponses :
Vous avez besoin de sous-requête:
SELECT e.DEPARTMENT_ID, e.FIRST_NAME, e.LAST_NAME FROM EMPLOYEES e WHERE e.DEPARTMENT_ID IN (SELECT e1.DEPARTMENT_ID FROM EMPLOYEES e1 GROUP BY e1.DEPARTMENT_ID HAVING AVG(e1.SALARY) < 12000 ) ORDER BY e.LAST_NAME ASC;
Vous avez besoin du salaire moyen du département. J'utiliserais une fonction de fenêtre:
Oh d'accord, je vais lire des fonctions de fenêtre. Pourriez-vous seulement me dire que signifie "e"? Est-ce une sorte de variable?
E est un alias de table. Je vous recommande vivement de rechercher des alias de table et de colonne, si vous n'êtes pas familier avec eux.
Vous pouvez utiliser la sous-requête corrélée
SELECT e.DEPARTMENT_ID, e.FIRST_NAME, e.LAST_NAME FROM EMPLOYEES a WHERE exists (SELECT 1 FROM EMPLOYEES b where a.department_id=b.department_id HAVING AVG(b.SALARY) < 12000 );
Essayez-le ..
SELECT e.DEPARTMENT_ID, e.FIRST_NAME, e.LAST_NAME from employee e where e.DEPARTMENT_ID in (select e.DEPARTMENT_ID from employee e group by e.DEPARTMENT_ID having avg(salary)<3000)
S'il vous plaît, expliquez ce qu'il a mal fait et pourquoi cette solution fonctionne. Cela l'aidera à comprendre ce qui se passe et pourrait empêcher la même erreur à l'avenir.
Vous devez calculer la moyenne pour chaque département, séparé des noms.