SQL reqûete

maxime -  
 maxime -
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 1969 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
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 1981 Statut Membre 316
 
ou est ce que tu vois qu'il est a l'université ?
0
maxime
 
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 1969 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
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
maxime
 
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 3742 Statut Membre 1 011
 
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 1981 Statut Membre 316
 
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 3742 Statut Membre 1 011
 
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 1981 Statut Membre 316
 
... 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
maxime
 
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