Je viens de commencer à étudier les requêtes SQL. Je pratique sur ce site: https://www.techonthenet.com/sql/joins_try_sql.php
Je veux trouver:
"le nom de l'employé avec le salaire le plus élevé pour chaque service".
Ma requête est:
SELECT first_name, max(salary) FROM employees, departments WHERE departments.dept_id=employees.dept_id GROUP BY employees.dept_id
Et j'obtiens une valeur nulle pour first_name :
Je comprends que le problème est dû aux expressions group by . Mais comment puis-je résoudre ce problème?
4 Réponses :
Vous pouvez également utiliser row_number () comme ci-dessous, vous n'avez pas besoin de joindre à la table des départements sauf si vous devez afficher le nom du département:
select em.* from employees em where salary = (select max(salary) from employees em2 where em.dept_id = em2.dept_id)EDIT
(Puisque OP ne veut pas utiliser la fonction row_number () amd, il s'est avéré que la requête sera utilisée dans mysql au lieu du serveur sql) -> Pouvez-vous s'il vous plaît essayez ceci:
select em.*
from employees em, (
Select dept_id, max(salary) salary
from employees e
group by dept_id
) x on x.dept_id=em.dept_id and x.salary = em.salary
Cela devrait fonctionner mais le compilateur en ligne n'accepte pas la jointure avec une sous-requête pour autant que je sache. La solution la plus simple à laquelle je puisse penser, dans ce cas:
Select e.*
from employees e
INNER JOIN
(
SELECT e.id, e.dept_id. e.first_name,
rn=row_number() over (partition by e.dept_id order by e.salary desc)
FROM employees e
) x ON x.id = e.id
where x.rn = 1
Désolé, je n'ai pas écrit dans le post: Je veux uniquement utiliser SELECT, WHERE, JOIN, GROUP BY, HAVING ... Merci!
Mis à jour ma réponse. @ l000000l
J'ai essayé cela aussi, en tant que requête mysql, mais cela ne fonctionne pas. Je pratique sur ce site techonthenet.com/sql/joins_try_sql.php , i Je pense que j'ai besoin d'expressions plus simples pour fonctionner.
Essayez ceci:
select first_name, b.dept_id, salary from employees a, ( SELECT employees.dept_id, max(salary) as salary FROM employees, departments WHERE departments.dept_id=employees.dept_id GROUP BY employees.dept_id )b where a.salary = b.salary and a.dept_id= b.dept_id
C'est le salaire maximum pour CHAQUE département ... Cela ne renvoie que le salaire maximum
@zip que se passe-t-il si différentes personnes dans différents départements ont le même salaire?
SELECT top 2 first_name,max(salary) FROM employees, departments WHERE departments.dept_id=employees.dept_id GROUP BY first_name order by max(salary) desc
Pouvez-vous fournir plus d'informations au lieu d'une réponse codée uniquement?
@chevybow first_name est sélectionné mais pas inclus dans la clause Group by, donc je l'ai ajouté dans group by et les ai classés par salaire maximum. Je pense que d'une manière ou d'une autre, le compilateur en ligne plutôt que de montrer l'erreur, il montre null à la place de cela.
essayez ceci:
SELECT e.first_name, e.salary FROM employees as e INNER JOIN departments as d ON d.dept_id=e.dept_id WHERE e.salary IN (SELECT max(salary) FROM employees GROUP BY dept_id)
Avez-vous défini un prénom dans la table des employés pour tous les enregistrements?
Nous avons besoin de voir la structure de ces deux tableaux pour aider davantage.
Oui j'ai. Vous pouvez vérifier les données des tables dans le premier lien si vous le souhaitez. Ou je peux les publier pour vous
Ok je poste les deux tableaux. Merci
J'ai affiché les tableaux.
pourquoi est-ce étiqueté à la fois mysql et sql-server? Lequel est-ce?
Pardon. Mise à jour.