1
votes

Requête SQL simple renvoyant une valeur nulle

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 : résultat de la requête Je comprends que le problème est dû aux expressions group by . Mais comment puis-je résoudre ce problème?

Tableaux: résultat de la requête


7 commentaires

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.


4 Réponses :


1
votes

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


3 commentaires

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.



0
votes

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


2 commentaires

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?



1
votes
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

2 commentaires

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.



1
votes

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)


0 commentaires