Proger
Messages postés248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 décembre 2008
-
19 déc. 2008 à 11:31
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 2011
-
19 déc. 2008 à 19:11
Bonjour,
Je cherche à récupérer la plus grosse facture faite à chaque clients (pour des besoins commercial, etc). Les factures sont stockées sur 2 tables, dont la structure est identique. Les clients sont dans une autre table. Les tables sont lié par du 0,n sur l'id client (idcli)
J'ai donc une tables [Clients] avec leurs coordonnées, [Bis07] contenant les factures 2007 et [Bis08] contenant les factures 2008.
En outre je dois prendre prioritairement les données de [Bis08] même si on trouve une facture plus grosse dans [Bis07]
Deux premières requêtes (une pour chaque table) s'occupent de trouver les maximum :
SELECT Bis07.idcli, Max(Bis07.montant) AS MaxMontant
FROM Bis07 GROUP BY Bis07.idcli;
Deux autres requêtes renvoient la référence de la facture et l'id client qui ont le plus gros montant :
SELECT Bis07.idfactc, Bis07.idcli
FROM req_Bis07_MaxM INNER JOIN Bis07 ON (req_Bis07_MaxM.MaxMontant= Bis07.montant) AND (req_Bis07_MaxM.idcli= Bis07.idcli);
Enfin, une requête renvoi les infos clients avec quelques données de la plus grosse facture (j'ai réduit les champs retournés pour simplifier) :
SELECT Clients.RSA, Clients.Contact, Bis07.idfactc, Bis07.montant, Bis07.datefact
FROM Clients INNER JOIN (Bis07 INNER JOIN req_Bis07_MFiltre ON Bis07.idfactc req_Bis07_MFiltre.idfactc ) ON Clients.idcli Bis07.idcli;
Problème 1 : ça fait pleins de petites requêtes
Problème 2 : si j'ai des montant identique pour un client, j'obtient des doublons
Problème 3 : je ne sais pas comment donner priorité a Bis08 sur Bis07 s'il existe le même idcli chez les deux.
Je ne peux pas utiliser DISTINCT parce que les données rappatrié (id/données des factures) sont différentes...
Avez vous une solution élégante ou des pistes de recherche ?
Merci !
Proger
Messages postés248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 décembre 2008 19 déc. 2008 à 17:33
"TOP 1 et order by MaxMontant" cela ne renvoi que le premier résultat de l'ensemble de la requête. Il semble que ce soit "TOP 1 WITH TIES" qui fonctionne avec order by... et access ne reconnais pas cet argument de toute façon !
Et je reste coincé au niveau du groupage, car je dois récupérer aussi le Bis07.idfactc et/ou Bis08.idfactc (différent d'une année à l'autre pas de soucis) en plus de l'idcli , et du coup ca "dégroupe" automatiquement le Max(Bis07.montant) !!
Un moment j'ai essayé de simplement trier par idcli et par ordre décroissant du montant, pour utiliser First( ) mais apparament access ignore la demande de tri quand on veux un groupe par First( ) ou Last( ) !
Access supporte les sous-requête, j'ai pu sans problèmes combiné les 2 premières requêtes, parfaitement au point d'avoir toujours les (rares) doublons sur un montant indentique dans une même année pour un même client (avec un idfactc evidemment différent)
Pour récupérer 2008 en priorité de 2007, en effet merci pour la piste, je vais donc récupérer 2008, puis recherche dans 2007 quand un idcli n'est pas renseigné (avec les jointure et EXISTS ca devrai passer).