SQL reqûete

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

  1. Modérateur
    Salut,

    tu fais fausse route, mais étant encore à l'université, tu devrais trouver ce qu'il faut dans tes cours...
    1. ou est ce que tu vois qu'il est a l'université ?
    2. 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.
    3. Modérateur
      si tu fais un group by ou un having, ce n'est pas avec un simple select champ1,champ2 que tu t'en sortiras...
    4. Qu'est ce que tu ferais alors pour écrire cette requête? car moi je vois pas du tout alors
    5. 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
  2. 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;
    1. 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
    2. ... 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é
    3. 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 :-)