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 :

[Aide] Requête avec un MAX() et la ligne liée


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2009
    Messages : 36
    Points : 41
    Points
    41
    Par défaut [Aide] Requête avec un MAX() et la ligne liée
    Bonjour,

    J'aimerais votre aide pour une requête qui me dépasse un peu

    Voici la description de mon problème, j'ai trois tables :
    • Client
    • LiasonClientMouvement
    • Mouvement


    Pour une client j'ai plusieurs mouvements, je dois afficher pour chaque client la dernière date de mouvements ainsi que sa somme.
    Pour l'instant j'ai ceci (qui ne marche pas bien sûr) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT noclient, MAX(date), montant FROM mouvement INNER JOIN liaisonmouvement ON idmouvement = fkmouveement INNER JOIN client ON fkclient = idclient GROUP BY noclient
    Le problème c'est que si je mets le montant dans le 'GROUP BY' cela ne joue plus, en effet ce qu'il me faut c'est une liste avec une seule fois le no de chaque client, puis la date maximum du mouvement et enfin la somme qui est liée à cette date.

    Comme je ne sais pas comment faire, je me tourne vers les grosses têtes de ce forum pour m'aider

    En vous remerciant d'avance pour vos réponses et vos conseils

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Bonjour


    Normal il faut passer par une requête imbriquée.

    En premier lieu, ce serait bien de formater ta requête. C'est bien plus facile a lire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT Selection.Noclient,
           Max_date,
           SUM(Montant)
      FROM (SELECT Noclient,
                   MAX(DATE) AS Max_date
              FROM Mouvement
                INNER JOIN Liaisonmouvement ON Idmouvement = Fkmouveement
                INNER JOIN Client ON Fkclient = Idclient
            GROUP BY Noclient) AS Selection
        INNER JOIN Mouvement ON (Mouvement.Fkclient = Selection.Noclient)
    GROUP BY Selection.Noclient, Max_date
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2009
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta réponse, seulement je ne veux pas la somme des montants, mais bien le montant liée à la date.

    Par exemple pour un client j'aurais

    client --- date --- montant
    1 --- 13/10/2011 --- 10
    1 --- 10/10/2011 --- 20
    1 --- 12/09/2011 --- 10
    1 --- 15/06/2011 --- 30

    Et moi j'aimerais sortir uniquement la ligne :
    1 --- 13/10/2011 --- 10
    Qui contient la plus grande date !

    Seulement avec ta requête cela me donne :
    1 --- 13/10/2011 --- 70

    Ce qui n'est pas ce que je veux

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Est-ce que cette requête te convient mieux ?

    PS : Vu que t'as pas aliasé tes tables et que tes colonnes ne sont pas préfixées, j'ai fais ce que j'ai pu, poste le modèle de tes données si ça ne marche pas, qu'on puisse t'aider plus efficacement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT c.noclient, m.date, m.montant 
    FROM mouvement m
    --INNER JOIN liaisonmouvement l ON m.idmouvement = l.fkmouveement 
    INNER JOIN (
    select max(m2.date) date, l2.fkclient
    from mouvement m2
    INNER JOIN liaisonmouvement l2 ON m2.idmouvement = l2.fkmouveement
    group by l2.fkclient
    ) t on t.date = m.date
    INNER JOIN client c ON l.fkclient = c.idclient and t.fkclient = c.idclient
    ;
    PS² : En commentaire, une tentative d'optimisation, je pense que c'est pas la peine de lire deux fois ta table de liaison grâce au sous-select qui fait le max, mais ça dépend de ton modèle...
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    et cela ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT Selection.Noclient,
           Mouvement.Date,
           SUM(Montant)
      FROM (SELECT Noclient,
                   MAX(DATE) AS Max_date
              FROM Mouvement
                INNER JOIN Liaisonmouvement ON Idmouvement = Fkmouveement
                INNER JOIN Client ON Fkclient = Idclient
            GROUP BY Noclient) AS Selection
        INNER JOIN Mouvement ON (Mouvement.Fkclient = Selection.Noclient and Mouvement.Date = selection.Max_data)
    GROUP BY Selection.Noclient, Mouvement.Date
    et comme l'indique StringBuilder dans son PS: c'est difficile sans le modèle


    NB : Donner un nom de colonne qui est en même temps un mot-clé DATE c'est, au moins, délicat
    Merci d'ajouter un sur les tags qui vous ont aidé

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2009
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Merci beaucoups cela semble fonctionner T'es un champion

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

Discussions similaires

  1. Besoin d'aide sur une requête avec un MAX()
    Par lcristin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/03/2013, 14h57
  2. Une requête avec un Max sur 2 champs
    Par Bils dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/09/2007, 14h04
  3. Problème de requête avec WHERE MAX()
    Par seb92500 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/01/2007, 12h27
  4. Aide requète avec jointure
    Par StanmaD dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/11/2006, 23h55
  5. Requête avec retour d'1 seule ligne de la seconde table
    Par Fred_76 dans le forum Requêtes
    Réponses: 16
    Dernier message: 09/11/2005, 13h46

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