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 :

requête avec MAX et GROUP BY


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de arcane
    Inscrit en
    Avril 2003
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 311
    Points : 178
    Points
    178
    Par défaut requête avec MAX et GROUP BY
    Bonjour,

    j'ai une table qui ressemble a ca :
    code - qte - date
    100 6864 2008-01-20
    100 16569 2008-01-25
    100 17087 2008-01-23
    100 8627 2008-01-22
    100 6768 2008-01-21
    100 16933 2008-01-24
    110 345.34 2008-01-21
    110 365.14 2008-01-20
    120 260.8 2008-01-22
    120 278.8 2008-01-20
    130 417.25 2008-01-22
    130 517.25 2008-01-23
    130 469.25 2008-01-24
    130 432.25 2008-01-20
    ...
    je voudrais en retenir :
    100 17087 2008-01-23
    110 345.34 2008-01-21
    120 260.8 2008-01-22
    130 517.25 2008-01-23
    ...
    c'est à dire obtenir pour une date maximale (23-01-2008) la qte pour chaque code.

    j'ai essayé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT code, qte, MAX( date )
    FROM matable
    WHERE (date <= '2008-01-23')
    GROUP BY code
    ORDER BY code
     
    donne :
          100 6864 2008-01-23 
          110 365.14 2008-01-21 
          120 278.8 2008-01-22 
          130 432.25 2008-01-23 
    ...
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    SELECT code, qte, MAX(date)
    FROM matable
    WHERE (date<='2008-01-23')
    GROUP BY code, qte, date
    HAVING date = max(date)
    order by code
     
    donne :
    100 6768 2008-01-21 
    100 6864 2008-01-20 
    100 8627 2008-01-22 
    100 17087 2008-01-23 
    110 345.34 2008-01-21 
    110 365.14 2008-01-20 
    120 260.8 2008-01-22 
    120 278.8 2008-01-20 
    130 417.25 2008-01-22 
    130 432.25 2008-01-20 
    130 517.25 2008-01-23 
    ...
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT code, qte, date
    FROM matable
    WHERE (date = ( 
    SELECT MAX( date ) FROM matable WHERE (date <= '2008-01-23') ) 
    )
    ORDER BY code;
     
    donne :
    100 17087 2008-01-23
    130 517.25 2008-01-23 
    ...
    j'ai essayé dans tous les sens, mais je n'obtiens pas la bonne solution.

    Qqn a une idée?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Essaye ca (sans certitude) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT code, qte, date
    FROM table 
    WHERE (date = (SELECT MAX(date) FROM matable 
    WHERE (date <= '2008-01-23')) GROUP BY code)
    ORDER BY code;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Petite correction (nom de la table) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT code, qte, date
    FROM matable
    WHERE (date = (SELECT MAX(date) FROM matable 
    WHERE (date <= '2008-01-23')) GROUP BY code)
    ORDER BY code;

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    non je pense pas que c'est bon, il doit falloir une jointure lié à une sous requete du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT code, qte, date
    FROM matable AS a 
        JOIN (SELECT code, MAX(date) FROM matable WHERE (date <= '2008-01-23')) GROUP BY code) AS b
            ON a.code = b.code AND a.date = b.date
    ORDER BY code;

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT code, SUM(qte), MAX( date )
    FROM matable
    WHERE (date <= '2008-01-23')
    GROUP BY code
    ORDER BY code

  6. #6
    Membre habitué Avatar de arcane
    Inscrit en
    Avril 2003
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 311
    Points : 178
    Points
    178
    Par défaut
    Les 2 solutions proposées ne donnent pas la bonne solution.

    Pour la jointure, j'ai un petit probleme de syntaxe :

    ERREUR 1248 - Every derived table must have its own alias
    si je mets un alias, j'ai soit cette erreur, soit une erreur de syntaxe
    je ne sais pas trop ou le mettre.
    mais je pense que dans l'idée, c'est quelque chose comme ca.

  7. #7
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Bonjour,

    Ce genre de requete peut repondre a vos attentes.
    Cependant ne pas utiliser des mots clés dans le nommage de vos colonnes (date remplacé ici par ladate).

    A tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT 
        matable.code, 
        matable.qte, 
        matable.ladate 
    FROM 
        matable 
    INNER JOIN  
        (SELECT 
              MAX(ladate) AS ladate, 
              code 
          FROM 
             matable WHERE ladate<='20080123' 
          GROUP BY code ) b 
    ON (matable.code=b.code and matable.ladate=b.ladate)
    Bon courage

  8. #8
    Membre habitué Avatar de arcane
    Inscrit en
    Avril 2003
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 311
    Points : 178
    Points
    178
    Par défaut
    impeccable, merci.
    pour la date, j'ai effectivement un nom de date plus long, mais je le change au copier-coller.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    J'etais vraiment pas loin, c'est la même requête, j'avais juste oublié de nommer le max(date)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2014, 11h18
  2. Requête avec max(), group by et having. je m'y perds
    Par hispanus dans le forum SQLite
    Réponses: 3
    Dernier message: 11/02/2010, 15h29
  3. Requête avec MAX et GROUP BY (2)
    Par kmarcel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/02/2008, 12h55
  4. [SQL Server] Requete avec MAX et group by
    Par joKED dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/01/2007, 13h00
  5. Requete avec max et group by
    Par Maxime555 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2006, 11h48

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