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 MAX qui me retourne trop de réponses


Sujet :

Langage SQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut Requête MAX qui me retourne trop de réponses
    Bonjour,

    j'ai une table de mouvements. Je voudrais par article, retourner le dernier mouvement en date.
    J'ai essayé de suivre un post trouvé sur le forum mais finalement cela me retourne ttes les lignes.

    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT F_DOCLIGNE.DO_Piece,F_DOCLIGNE.DL_TNomencl, F_DOCLIGNE.AR_Ref, DO_Date, Max(DO_Date) AS Niveau
    FROM F_DOCLIGNE
    WHERE (F_DOCLIGNE.AR_Ref = '0064006012') AND (AR_Ref Is Not Null) AND F_DOCLIGNE.DL_TNomencl=1
    GROUP BY F_DOCLIGNE.DO_Piece, F_DOCLIGNE.DL_TNomencl, F_DOCLIGNE.AR_Ref, DO_Date

    Et voici un extrait du résultat :
    DO_Piece DL_TNomencl AR_Ref DO_Date Niveau
    BF100211 1 0064006012 2010-03-04 00:00:00 2010-03-04 00:00:00
    BF100315 1 0064006012 2010-03-25 00:00:00 2010-03-25 00:00:00
    BF101115 1 0064006012 2010-07-29 00:00:00 2010-07-29 00:00:00
    BF101178 1 0064006012 2010-08-31 00:00:00 2010-08-31 00:00:00
    BF110309 1 0064006012 2011-02-17 00:00:00 2011-02-17 00:00:00
    Moi, je pensais que cela allait me retourner uniquement la dernière ligne en rouge (la date la plus récente)

    Auriez-vous une idée ?
    Merci
    Thibault

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    En plaçant do_piece et do_date dans la clause GROUP BY, tu as peu de chance d'obtenir une seule ligne.
    Par ailleurs, les conditions (F_DOCLIGNE.AR_Ref = '0064006012') AND (AR_Ref IS NOT NULL) sont redondantes.

    Ce type de requête est écrit très régulièrement dans ce forum :

    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  doc.do_piece
        ,   doc.dl_tnomencl
        ,   doc.ar_ref
        ,   doc.do_date
    FROM    f_docligne  doc
    WHERE   doc.ar_ref = '0064006012'
        AND doc.dl_tnomencl = 1
        AND EXISTS  
            (   SELECT  NULL
                FROM    f_docligne  dat
                WHERE   doc.dl_tnomencl = dat.dl_tnomencl
                    AND doc.ar_ref      = dat.ar_ref
                HAVING  doc.do_date     = MAX(dat.do_date)
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    Merci Beaucoup Al1_24 pour votre aide.

    Cela me fait bien avancer mais je viens de constater un résultat étrange :

    Le résultat me semblait bon avec votre requête.
    Mais en voulant d'inverser la sélection doc.dl_tnomencl = 1 en 0
    (pour faire une 2ème requête), je me suis rendu compte d'une erreur.

    j'ai modifié le WHERE ainsi j'ai borné sur 1 article pour la contrôle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE   doc.ar_ref= '0003006068' 
    AND doc.dl_tnomencl = 0
    J'obtiens :
    do_piece dl_tnomencl ar_ref do_date
    BF100557 0 0003006068 2010-05-04 00:00:00
    Mon soucis est qu'il existe dans ma base, 2 lignes pour cet article :
    DO_Piece DL_TNomencl AR_Ref DO_Date
    BF100557 0 0003006068 2010-05-04 00:00:00
    BF100632 1 0003006068 2010-05-17 00:00:00
    La requête ne me retourne pas le max (DO_Date)

    Le champ DO_Date est un samlldatetime. Donc SQL devrait bien le trier ?
    Auriez-vous une idée ?

    Merci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avec le filtre WHERE doc.dl_tnomencl = 0, vous excluez de facto tous les lignes dont le dl_tnomencl valent 1, avant même de chercher la date la plus récente.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    AVIS A LA POPULATION

    JE NE SAIS PAS LIRE
    JE NE SAIS PAS OBSERVER
    JE NE VOIS PLUS L'EVIDENCE


    désolé pour ce doute.

    Merci à vous 2

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

Discussions similaires

  1. [AJAX] Requête Ajax qui ne retourne rien
    Par Droup dans le forum jQuery
    Réponses: 5
    Dernier message: 22/09/2013, 21h30
  2. Réponses: 1
    Dernier message: 22/06/2012, 16h58
  3. [MySQL] requête select qui ne retourne qu'une seule ligne
    Par rose25 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/07/2009, 15h11
  4. [ODBC] Requète SQL qui ne retourne rien
    Par WebManiaK dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/01/2009, 14h33

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