Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requêtes fonctions agrégats

    20 novembre 2011 à 21:21:26

    Bonsoir, nouvelle sur ce forum, je commence à m'intéresser de manière active aux SGBD. Surtout Access et My SQL.
    Je suis novice en SQL, et je commence déjà à avoir des problèmes sur les requêtes:

    Je cherche à déterminer le meilleur employé de ma base de données
    SELECT Max(M5.[Somme par employé]) AS [Meilleur Employé], M5.Employés.Nom
    FROM M5;

    Quand je cherche à éxécuter ma requête, Access me dit que je vais "exécuter une requête ne comprenant pas l'expression spécifiée "Nom" comme une partie de la fonction d'agrégat.

    Ce n'est pas la première fois que j'ai ce problème, et je n'ai jamais compris en quoi ça consistait.

    Nom correspondrait au Nom du meilleur employé, c'est quand même possible non?

    Je pense que le problème vient du fait que le SGBD n'arrive pas à reconnaître le Nom correspondant au MAX, il faudrait faire une sorte de jointure? Sauf qu'ici cela me paraît ridicule.


    Merci beaucoup pour votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      20 novembre 2011 à 22:11:40

      Salut,

      Je ne suis pas sur d'avoir tout compris mais l'erreur vient de "M5.Employés.Nom" il me semble
      "Employés" : il vient d'où ?

      La syntaxe est :
      table.champ

      donc :
      M5.Nom

      donc :
      SELECT Max(M5.[Somme par employé]) AS [Meilleur Employé], M5.Nom
      FROM M5;
      


      Pour tes noms de champs, il faut qu'ils soient écrit de la même façon dans ta requête que dans ta base de données, selon le SGBD c'est à la majuscule/minuscule près ;)

      J'espère avoir pu t'aider,
      bonne soirée ;)
      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2011 à 0:15:58

        > le SGBD n'arrive pas à reconnaître le Nom correspondant au MAX

        Effectivement, on utilise toujours les agrégats soit avec une clause GROUP BY pour déterminer comment les résultats sont groupés, soit sans GROUP BY, et tout est groupé en un seul groupe.

        Par exemple max(machin) GROUP BY truc te donne le maximum de "machin" pour chaque valeur de "truc" (il y a donc un groupe par valeur de "truc").

        Bref, quand tu utilises des agrégats, toutes les colonnes du résultat doivent être soit des agrégats, soit figurer dans le GROUP BY.

        Dans ton cas, "nom" n'est ni l'un ni l'autre, donc la BDD ne sait pas dans quelle ligne prendre la bonne valeur.

        > Nom correspondrait au Nom du meilleur employé, c'est quand même possible non?

        C'est possible mais pas de cette façon, imagine que tu écrives SELECT min(truc), max(truc), nom FROM table alors le nom serait celui qui a le min ou le max ? MySQL résoud le problème en retournant n'importe lequel au pif, sur les autres bdd on a une erreur.

        > il faudrait faire une sorte de jointure?

        Ouais.

        SELECT * FROM table ORDER BY score DESC LIMIT 1

        ça te donne la ligne qui a le score le plus élevé (si il y a des ex aequo ce sera au pif).

        SELECT * FROM table t JOIN (SELECT max(score) AS score FROM table) m USING (score)

        ça retourne toutes les lignes qui ont le score max (comme il peut y avoir plusieurs maximums ex-aequo, la requête doit pouvoir retourner plusieurs lignes...)

        Quand à la syntaxe ridicule avec les [], c'est access, faut pas regarder ça...
        • Partager sur Facebook
        • Partager sur Twitter

        Requêtes fonctions agrégats

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown