SQL reqûete

Fermé
maxime - 21 nov. 2011 à 16:33
 maxime - 21 nov. 2011 à 22:17
Bonjour,

J'ai un petit service à vous demander...voilà j'ai une requête tout bête qui me pose problème...



Ecrire en SQL la req permettant d'avoir pour chaque employé son numéro et son dernier salaire



table HISTO_SALAIRE (NumEmp, DateSalaire, Salaire)
cette table mémorise tous les changements de salaires des employé...


Jme prend la tête avec cette requête, je me doute que le début est :


Select NumEmp, DateSalaire
from HISTO_SALAIRE
...



Je sais pas s'il faut mettre un MAX dans un Having ou un Group by...
c'est aprés le FROM que je doute...si vous pouviez m'aider svp :)





Cordialement,


2 réponses

blux Messages postés 26020 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 3 mai 2024 3 289
21 nov. 2011 à 16:36
Salut,

tu fais fausse route, mais étant encore à l'université, tu devrais trouver ce qu'il faut dans tes cours...
0
vordano Messages postés 1682 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 20 juillet 2012 316
21 nov. 2011 à 16:39
ou est ce que tu vois qu'il est a l'université ?
0
Oui, on comprend facilement que c'est une question de cours que je n'arrive pas a résoudre.
Qu'entends tu par "faire fausse route " ? Je pense aussi que je m'oriente peut etre mal, et c'est pour ça que j'ai créé ce post.
0
blux Messages postés 26020 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 3 mai 2024 3 289
21 nov. 2011 à 16:45
si tu fais un group by ou un having, ce n'est pas avec un simple select champ1,champ2 que tu t'en sortiras...
0
Qu'est ce que tu ferais alors pour écrire cette requête? car moi je vois pas du tout alors
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 nov. 2011 à 17:00
En fait ça dépend du SGBD.
MySQL par exemple est permissif, et permet de récupérer un champ qui n'est ni une fonction d'agrégat, ni spécifié dans les champs agrégés. Dans la plupart des cas, ce n'est à utiliser que si la colonne en question a toujours la même valeur ; mais dans le cas des fonctions d'agrégat MIN et MAX, cela donne la valeur correspondante à la ligne qui contient ce MIN ou ce MAX.
Cf la doc : http://dev.mysql.com/doc/refman/5.0/fr/group-by-hidden-fields.html
Donc en MySQL, la requête suivante fonctionne :
SELECT NumEmp, MAX(DateSalaire), Salaire
FROM HISTO_SALAIRE
GROUP BY NumEmp

Par contre, comme précisé dans la doc, ce n'est pas du SQL standard, et cela ne fonctionnera pas avec d'autres SGBD. Dans les autres, il faudra faire une sous-requête pour cibler exactement la ligne souhaitée dans la table.

Xavier
0
vordano Messages postés 1682 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 20 juillet 2012 316
21 nov. 2011 à 16:50
bon, pour la réponse a ta demande:

a première vue on peux penser qu'il faut utiliser la fonction MAX(), sauf que celle ci est utilisable dans le select, et que dans ton cas on ne veux pas renvoyer le maximum d'un champ, mais seulement le champ d'a coté.
dans ce cas, on serais tenté de faire un DateSalaire=MAX(DateSalaire) en mettant le salaire dans le select.
mais comme je l'ai dis plus haut le MAX() se fait dans le select (dans le where c'est pas accepté partout)

donc il y a 2 solution je pense:
select salaire
from table
where datasalaire=(select max(datesalaire) from table where numemp = "truc")
and numemp = "truc";

ou bien
select salaire
from table
where numemp="truc"
order by datesalaire DESC
limit 1;
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 nov. 2011 à 17:07
Bonjour,

Ça ne répond pas tout-à-fait à la question, qui précise :
« Écrire en SQL la req permettant d'avoir pour chaque employé son numéro et son dernier salaire »

Les numemp="truc" sont donc de trop, il faut les remplacer par des group by.

Xavier
0
vordano Messages postés 1682 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 20 juillet 2012 316
21 nov. 2011 à 17:20
... j'avais pas vu le pour chaque employé
donc oui ta méthode est bonne, mais la mienne c'est pour un seul employé donné
0
Je vous remercie bien d'avoir pris le temps de répondre...je vérifierai ça demain mais il me semble que je l'avais déjà tentée celle-là...dans ce cas-là je ferai une sous-requête comme expliqué

Merci :-)
0