IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Utilisation de la fonction max


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 70
    Points : 41
    Points
    41
    Par défaut Utilisation de la fonction max
    Bonjour.
    J'ai vraiment du mal avec le concept de regroupement ... Ce que j'eassaye de faire ne me semble pas compliqué et pourtant cela ne fonctionne pas.
    J'ai une table Eleve(nom, note, trimestre, periode). Donc lorsque j'execute un "SELECT * d'une_vue" j'obtiens quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AA  | 13 | trim1 | per11
    AA  | 10 | trim1 | per12
    AA  | 15 | trim2 | per21
    AB  | 9  | trim1 | per11
    AB  | 17 | trim1 | per12
    AB  | 18 | trim2 | per21
    BB  | 2  | trim1 | per11
    BB  | 8  | trim1 | per12
    BB  | 9  | trim2 | per21
    Voyez ... rien de transcandant
    Devinez ce que je voudrais faire ? Avoir le max des notes de chaque nom, pour chaque trimestre avec la periode associé ! Bravo \o/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AA  | 13 | trim1 | per11
    AA  | 15 | trim2 | per21
    AB  | 17 | trim1 | per12
    AB  | 18 | trim2 | per21
    BB  | 8  | trim1 | per12
    BB  | 9  | trim2 | per21
    mais j'obtiens plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AA  | 13 | trim1 | per11
    AA  | 15 | trim2 | per21
    AB  | 17 | trim1 | per11
    AB  | 18 | trim2 | per21
    BB  | 8  | trim1 | per11
    BB  | 9  | trim2 | per21
    Vous voyez il ne garde pas la bonne periode, garde la "1ere" a chaque fois.
    voici ce que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom, max(note) as Mnote, trimestre, periode
    FROM Eleve
    GROUP BY nom, trimestre
    Est ce grave docteur ?

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom, max(note) AS Mnote, trimestre, periode
    FROM Eleve
    GROUP BY nom, trimestre, periode
    il faut mettre tous les champs dans le group by

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Citation Envoyé par Mathusalem Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom, max(note) AS Mnote, trimestre, periode
    FROM Eleve
    GROUP BY nom, trimestre, periode
    il faut mettre tous les champs dans le group by
    Anomalie qu'un SGBD strict sur la syntaxe aurait détectée....

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 70
    Points : 41
    Points
    41
    Par défaut
    Eum je crois bien que ca ne fonctionne pas... (et je voudrais juste preciser que je l'avais deja essayer celle là )
    ma requete c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, max(note) as note, matiere, controle
    FROM view_login_note_mat_ctl v
    WHERE nom = 'nom1'
    GROUP BY nom, matiere, controle
    Ce que j'obtiens c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    nom|note|matiere|controle
    "nom1",11,"francais","controle0 de francais"
    "nom1",11,"francais","controle1 de francais"
    "nom1",14,"francais","controle2 de francais"
    "nom1",13,"francais","controle3 de francais"
    "nom1",0,"math","controle0 de math"
    "nom1",4,"math","controle1 de math"
    "nom1",12,"math","controle2 de math"
    "nom1",0,"histoire","controle0 de histoire"
    "nom1",12,"histoire","controle1 de histoire"
    "nom1",9,"musique","controle0 de musique"
    "nom1",12,"musique","controle1 de musique"
    "nom1",1,"musique","controle2 de musique"
    C'est exactement le meme nombre de ligne que sans regroupage...
    Pour etre sûr detre clair, ce que je voudrais avoir au final cest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nom|note|matiere|controle
    "nom1",14,"francais","controle2 de francais"
    "nom1",12,"math","controle2 de math"
    "nom1",12,"histoire","controle1 de histoire"
    "nom1",12,"musique","controle1 de musique"

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Donc tu veux, pour chaque (nom, matiere), la ligne pour laquelle la note est la plus élevée...

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 70
    Points : 41
    Points
    41
    Par défaut
    Oui c'est bien ca ! C'est pas ce qu'il s'est resenti en debut de topic ?

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Il te faut passer par une sous-requête.

    Voici une structure de requête pour sélectionner les lignes correspondant à la date la plus récente pour chaque id_groupe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  t1.* 
    FROM    matable AS t1 
    WHERE   EXISTS 
            (   SELECT  1 
                FROM    matable AS t2 
                WHERE   t1.id_groupe = t2.id_groupe 
                HAVING  t1.col_date = MAX(t2.col_date) 
            ) 
    ;
    Je te laisse l'adapter à ton cas...

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 881
    Points : 53 060
    Points
    53 060
    Billets dans le blog
    6
    Par défaut
    Votre erreur vient du fait que vous voulez à la fois avec le max (donc un regroupement de plusieurs ligne) et le détail (donc la ligne).

    A +

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 70
    Points : 41
    Points
    41
    Par défaut
    Merci pour ce bout de code.
    Malheureusement je n'ai pas reussi à l'utiliser ...
    Ce "SELECT 1" me perturbe (j'ai essayé avec *, en penssant que cetait une faute de frappe ) et puis j'ai essayé le WHERE avec l'id des notes (présents dans la vue aussi) et resultat : 0 ligne
    Mais quand meme j'ai compris mon erreur je crois, alors j'ai pondu ce truc horrible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t1.*, t2.controle
    FROM (
      SELECT  t1.name, t1.matiere, max(t1.note) as note
        FROM view_name_matiere_note_controle AS t1
      GROUP BY t1.name, t1.matiere
      ) t1
      JOIN view_name_matiere_note_controle AS t2
        ON t1.name = t2.name AND t1.matiere = t2.matiere AND t1.note = t2.note
    ;
    J'ai join sur tout ces champs parceque je n'arrive pas a recuperer l'id de la note trouver avec le GROUP BY, cest le meme probleme qu'avant : pour chaque (nom, matiere), avoir la l'id pour laquelle la note est la plus élevée...
    Bref a moins que vuos me dites "cest vriament trop moche ske ta fait" je cloturerai ce topic

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Ce que tu as fait n'est pas si moche que ça
    Compare maintenant les temps d'exécution avec celle-là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  t1.* 
    FROM    view_name_matiere_note_controle AS t1 
    WHERE   EXISTS 
            (   SELECT  'n''importe quoi' 
                FROM    view_name_matiere_note_controle AS t2 
                WHERE   t1.name = t2.name 
                    AND t1.matiere = t2.matiere
                HAVING  t1.note = MAX(t2.note) 
            ) 
    ;
    Avec EXISTS, la liste des éléments retournés par la sous-requête n'est d'aucune utilité. Ce qui importe, c'est la présence de lignes correspondant à la sélection.
    Donc SELECT 1, NULL ou 'toto', ça n'a aucune importance

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 70
    Points : 41
    Points
    41
    Par défaut
    Bon j'ai ecris ce que tu ma dit en remplacant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  'n''importe quoi'
    paret ca me retourne 0 ligne encore.
    Tu vois pas dou sa pourrai venir ?

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Avec quel SGBD ? quelle version ?

    Règles du forum Langage SQL à lire par tous

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 70
    Points : 41
    Points
    41
    Par défaut
    MySQL: 5.0.45

Discussions similaires

  1. [Toutes versions] Utilisation de la fonction max
    Par thoruiz dans le forum VBA Access
    Réponses: 4
    Dernier message: 27/08/2019, 09h19
  2. Ouverture d'un fichier et utilisation de la fonction max
    Par gta9956 dans le forum Général Python
    Réponses: 5
    Dernier message: 03/06/2014, 21h09
  3. Utilisation de la fonction MAX()
    Par JustyDark dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/01/2014, 22h36
  4. Utilisation de la fonction MAX
    Par PatStan17 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/04/2012, 17h49
  5. Utilisation de la fonction MAX
    Par joyeux_lapin13 dans le forum SAS Base
    Réponses: 4
    Dernier message: 23/02/2011, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo