Requête selection de données des maximum...

Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 décembre 2008 - 19 déc. 2008 à 11:31
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 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 !

4 réponses

fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
19 déc. 2008 à 11:48
Salut,

Pb 1 : perso pour moi ce n'est pas un pb. Au moins c'est plus lisible q'une requête de 3 kms.

Pb 2 : GROUP BY Bis07.idcli, Bis07.montant , je crois que ça peut résoudre le problème (à tester)

Pb3 : j'ai pas trop d'idée. Il faudrait avec un truc qui fasse, si l'idCli n'est pas dans Bis08 alors on regarde dans Bis07
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
19 déc. 2008 à 13:09
Salut,

Avec un petit union tu peux trouver à diminuer le nombre de requete.
Une colonne supplémenantaire pour l'année

Un TOP 1 et order by MaxMontant,année pour selectionner l'année la meilleure si les deux montants sont identiques

Exemple de debut de requete pour la question 1

SELECT Bis07.idcli, Max(Bis07.montant) AS MaxMontant,2007 as  annee

FROM Bis07 GROUP BY Bis07.idcli
UNION
SELECT Bis08.idcli, Max(Bis08.montant) AS MaxMontant,2008 as  annee


FROM Bis08 GROUP BY Bis08.idcli

Access est tres limité dans les requetes
tu ne peux pas utilisé de sous requete dans les from par exemple (il me semble)

Donc tu n'as pas trop le choix de faire plusieurs sous requetes.

BON SQL
0
Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 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).
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
19 déc. 2008 à 19:11
Désolé c'est les habitudes de SQL server pour le TOP 1.

Access est loin ??
Et je faisais tout par programme dans access.

Pour le groupage tu peux mettre ta requete pour voir, si j'ai une piste.

J'ai donné les pistes de tete pour faire avancer le probleme.
(des having peuvent servir au passage on les oublie souvent)

apres
des
select ...
from (select ... UNION select ...)
WHERE ....

Fonctionne en sql server il me semble en access peut etre
0
Rejoignez-nous