Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/10/2011, 08h47   #1
Nouveau Membre du Club
 
Inscription : août 2009
Messages : 36
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : août 2009
Messages : 36
Points : 35
Points : 35
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 :
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
imanoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 09h17   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
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 :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 09h54   #3
Nouveau Membre du Club
 
Inscription : août 2009
Messages : 36
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : août 2009
Messages : 36
Points : 35
Points : 35
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
imanoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 09h59   #4
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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 :
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...
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 10h29   #5
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
et cela ?


Code :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 10h48   #6
Nouveau Membre du Club
 
Inscription : août 2009
Messages : 36
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : août 2009
Messages : 36
Points : 35
Points : 35
Merci beaucoups cela semble fonctionner T'es un champion
imanoka est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h13.


 
 
 
 
Partenaires

Hébergement Web