begin process at 2010 02 10 01:51:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

Access

 > 

Requêtes

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 19 décembre 2008 à 11:31:04 | requête selection de données des maximum...

Proger

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 !
vendredi 19 décembre 2008 à 11:48:15 | Re : requête selection de données des maximum...

fregolo52

Membre Club
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
vendredi 19 décembre 2008 à 13:09:18 | Re : requête selection de données des maximum...

nhervagault

Administrateur CodeS-SourceS
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






vendredi 19 décembre 2008 à 17:33:51 | Re : requête selection de données des maximum...

Proger

"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).
vendredi 19 décembre 2008 à 19:11:49 | Re : requête selection de données des maximum...

nhervagault

Administrateur CodeS-SourceS
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





Cette discussion est classée dans : données, montant, clients, idcli, bis07


Répondre à ce message

Sujets en rapport avec ce message

Serveur BD - client avec interface comme open office BD [ par younes371 ] Bonjour,j'ai un grand problème et vraiment je me galère depuis lengtemps, après des recherches et des recherches sans aucun resultat pertinante, je vi Architecture client/server [ par younes371 ] Bonjour,j'ai des données, et je veux les inserer dans un serveur de base de données, et je veux que les utilisateurs (postes clients) peuvent faire de Problème de connexion SQL SERVER 2005 / FREEBOX [ par marcofelipe ] Bonjour,Voila mon problème : J'ai créé une base de données sur SQL SERVER 2005 pour créer une application sur un serveur d'application et pourvoir l'u Langue base de données différente que celle du serveur [ par bossun ] Salut,J'ai un serveur SQL 2005 en Anglais (us_English)J'ai besoin qu'au moins une de mes base soit localisé en fr_Switzerlandà quel niveau dois-je def Cryptage de données [ par anspauldou ] BonjourJe voudrais savoir s'il est possible de crypter les données de ma base de données SQL 2000 server. Si oui comment procède t'on ?Merci d'avance Schéma de données [ par MadM@tt ] Bonjour à tous,J'aurais besoin de votre avis au niveau de la conception d'une de mes tables.J'ai des sites à référencer dans un annuaire.J'ai une tabl oracle [ par jouinicimpf ] salut Urgent, je dois faire un echange de données chaque jour entre 2 serveur de base de données l'un ORACLE7 l'autre ORACLE 9iComment je peut faire ç fichier plat sql [ par jshinobi ] Bonjourcomment mettre les données d'un fichier log dans une base de données sql oracle toute en respectant les champs du log? sql et fichier ".dat" [ par jshinobi ] Bonjour,je suis débutant en base de données et j'ai un fichier ".dat" qui contient les informations suivantes :"R:001:00:001:02:000141:000383:000000:0 Table lock [ par Pat35 ] Bonjour,J'ai un problème de lock sur une table.Mon architecture est la suivante : - Une table de données avec des triggers qui enregistrent les PK des


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales