[ACCESS] requete SQL max date

requete SQL max date [ACCESS] - VB/VBA/VBS - Programmation

Marsh Posté le 11-06-2007 à 16:45:50    

Bonjour tout le monde,
 
je cale sur une requete sql à passer dans access, et comme ca dure un peu trop, je fais appel à vous.
 
La situation:
3 tables avec
KM_D           (documents)                      
iRefDoc (clé primaire)
iRefDST (numérique)
dDate (date)
sDocTitre (texte)
 
KM_DST (sous type de document)
iRefDST (clé primaire)
sDocST (texte)
iRefDT (numérique)
 
KM_DT (type de document)
iRefDT (clé primaire)
sDocT (texte)
 
les liaisons sont KM_D.iRefDST = KM_DST.iRefDST et KM_DST.iRefDT=KM_DT.iRefDT
 
le résultat de la requête doit être
sDocT, sDocST, sDocTitre, dDate avec la dDate maximum dans la table KM_D...
 
dsl pas de screenshot pour les tables...

Reply

Marsh Posté le 11-06-2007 à 16:45:50   

Reply

Marsh Posté le 11-06-2007 à 17:42:35    

indice : faut passer par une sous-requête où km_d.date = (select max(km_d.date)

Reply

Marsh Posté le 11-06-2007 à 18:00:15    

oui, ca j'avais percuté ^^°
mais mon probleme c'est que pour un exemple
iRefDST   Date
1                 15/02/07
1                 23/05/07
2                 23/05/07
3                 16/04/07
 
mon résultat actuel avec max(date) est
1   23/05/07
2   23/05/07            
et
le 3  16/04/07 n'apparait pas :(

Reply

Marsh Posté le 11-06-2007 à 18:27:12    

le max prend la date la plus grande en l'occurence le 23/05/2007 et donc pas le 16/04/07
non ?
 
ce que tu veux faire c pas en fait un tri croissant ?

Reply

Marsh Posté le 11-06-2007 à 18:41:03    

Bonsoir,
SELECT km_d.irefdst, Max([ddate]) AS Expr1
FROM km_d
GROUP BY km_d.irefdst
;
 
???
Cordialement


Message édité par seniorpapou le 11-06-2007 à 18:41:36
Reply

Marsh Posté le 12-06-2007 à 00:32:41    

re bonsoir,
le group by me permet d'imposer quoi exactement stp senior ?

Reply

Marsh Posté le 12-06-2007 à 07:19:58    

Bonjour,
c'est à mettre dans ta sous requète
 
tu auras pour chaque irefdst la date max qui lui est propre.
si tu ne le mets pas tu as les irefdst qui ont la date max de km_d.
 
lances la requete et regardes ce qu'elle donne.
MagicBuzz ou ingénieurcesi ou un autre te diront comment l'intégrer dans une requète complète. OU bien ils te diront pourquoi je me plante (encore)
Cordialement

Reply

Marsh Posté le 12-06-2007 à 10:31:34    

Je crois qu'il y a malentendu.

jpcheck a écrit :

...avec la dDate maximum dans la table KM_D...


jpcheck a écrit :


iRefDST   Date
1                 15/02/07
1                 23/05/07
2                 23/05/07
3                 16/04/07

 

mon résultat actuel avec max(date) est
1   23/05/07
2   23/05/07          
et
le 3  16/04/07 n'apparait pas :(


Ton résultat me semble conforme à ce que tu demandes.
J'en déduis que ta demande est peut-être mal formulée.
Tu ne souhaites pas la date la plus récente de la table KM_D (23/05/07), mais la plus récente de l'enregistrement (iRefDST) en cours de jointure avec KM_D, respectivement 23/05/07 pour iRefDST=1, 23/05/07 pour iRefDST=2, 16/04/07 pour iRefDST=3, non ?

 

Si j'ai bien compris, alors ta requete devra ressembler à ça :
SELECT KM_DT.sDocT, KM_DST.sDocST, KM_D.sDocTitre, KM_D.dDate
FROM KM_D, KM_DST, KM_DT
WHERE KM_D.iRefDST = KM_DST.iRefDST and KM_DST.iRefDT=KM_DT.iRefDT and KM_D.dDate = (SELECT Max(dDate) FROM KM_D WHERE KM_D.iRefDST = KM_DST.iRefDST)

 

ou ça (syntaxe Access) :
SELECT KM_DT.sDocT, KM_DST.sDocST, KM_D.sDocTitre, KM_D.dDate
FROM KM_D INNER JOIN (KM_DST INNER JOIN KM_DT ON KM_DST.iRefDT = KM_DT.iRefDT) ON KM_D.iRefDST = KM_DST.iRefDST
WHERE KM_D.dDate = (SELECT Max(dDate) FROM KM_D WHERE KM_D.iRefDST = KM_DST.iRefDST)

 

Je ne suis pas sûr à 100% (je manque de pratique) mais j'espère que ça t'éclairera.


Message édité par tegu le 12-06-2007 à 11:18:34
Reply

Marsh Posté le 12-06-2007 à 12:41:18    

merci, je vais tester ca  :jap:

Reply

Marsh Posté le 12-06-2007 à 15:02:46    

je vous aime  :pt1cable:  
 
bon alors dans mon cas, c'est un peu plus compliqué que la demande de départ, mais ca marche :)
 

Code :
  1. SELECT KM_Documents_Type.sDocType as Type_de_Document, KM_Documents_Sous_Type.sDocSousType as sous_type_de_document, KM_Documents.sDocumentTitre as Titre_du_document, KM_Documents.dDate_Document AS date_du_document, KM_Documents.iRefDocument FROM KM_Documents_Type INNER JOIN (KM_Documents_Sous_Type INNER JOIN KM_Documents ON KM_Documents_Sous_Type.iRefDocSousType = KM_Documents.iRefDocSousType) ON KM_Documents_Type.iRefDocType = KM_Documents_Sous_Type.iRefDocType WHERE (irefannexe IS NULL) AND KM_Documents_TYpe.iRefDocType = 16 and (((KM_Documents.dDate_Document) In (SELECT MAX(ddate_document)  FROM KM_Documents WHERE KM_Documents.iRefDocSousType=KM_Documents_sous_type.iRefDocSousType ))) AND KM_Documents_Sous_Type.iRefDocSousType IN (SELECT iRefDocSousType from KM_Acces_Documents_Sous_Type where iGroupeID=4 AND (iTypeAcces = 1 OR iTypeAcces = 2) ) ORDER BY sDocType, sDocSousType;


 
je sais, il y a boire et a manger :p

Reply

Marsh Posté le 12-06-2007 à 15:02:46   

Reply

Marsh Posté le 12-06-2007 à 15:03:22    

je vous aime  :pt1cable:  
 
bon alors dans mon cas, c'est un peu plus compliqué que la demande de départ, mais ca marche :)
 

Code :
  1. SELECT KM_Documents_Type.sDocType as Type_de_Document, KM_Documents_Sous_Type.sDocSousType as sous_type_de_document, KM_Documents.sDocumentTitre as Titre_du_document, KM_Documents.dDate_Document AS date_du_document, KM_Documents.iRefDocument FROM KM_Documents_Type INNER JOIN (KM_Documents_Sous_Type INNER JOIN KM_Documents ON KM_Documents_Sous_Type.iRefDocSousType = KM_Documents.iRefDocSousType) ON KM_Documents_Type.iRefDocType = KM_Documents_Sous_Type.iRefDocType WHERE (irefannexe IS NULL) AND KM_Documents_TYpe.iRefDocType = 16 and (((KM_Documents.dDate_Document) In (SELECT MAX(ddate_document)  FROM KM_Documents WHERE KM_Documents.iRefDocSousType=KM_Documents_sous_type.iRefDocSousType ))) AND KM_Documents_Sous_Type.iRefDocSousType IN (SELECT iRefDocSousType from KM_Acces_Documents_Sous_Type where iGroupeID=4 AND (iTypeAcces = 1 OR iTypeAcces = 2) ) ORDER BY sDocType, sDocSousType;


 
je sais, il y a boire et a manger :p

Reply

Marsh Posté le 12-06-2007 à 15:39:21    

jpcheck a écrit :

je vous aime  :pt1cable:  
 
bon alors dans mon cas, c'est un peu plus compliqué que la demande de départ, mais ca marche :)
 

Code :
  1. SELECT KM_Documents_Type.sDocType as Type_de_Document, KM_Documents_Sous_Type.sDocSousType as sous_type_de_document, KM_Documents.sDocumentTitre as Titre_du_document, KM_Documents.dDate_Document AS date_du_document, KM_Documents.iRefDocument FROM KM_Documents_Type INNER JOIN (KM_Documents_Sous_Type INNER JOIN KM_Documents ON KM_Documents_Sous_Type.iRefDocSousType = KM_Documents.iRefDocSousType) ON KM_Documents_Type.iRefDocType = KM_Documents_Sous_Type.iRefDocType WHERE (irefannexe IS NULL) AND KM_Documents_TYpe.iRefDocType = 16 and (((KM_Documents.dDate_Document) In (SELECT MAX(ddate_document)  FROM KM_Documents WHERE KM_Documents.iRefDocSousType=KM_Documents_sous_type.iRefDocSousType ))) AND KM_Documents_Sous_Type.iRefDocSousType IN (SELECT iRefDocSousType from KM_Acces_Documents_Sous_Type where iGroupeID=4 AND (iTypeAcces = 1 OR iTypeAcces = 2) ) ORDER BY sDocType, sDocSousType;


 
je sais, il y a boire et a manger :p


pis je crois que t'as résolu le dilème de "à quel moment je fais ma césure pour indenter mon code ?"
 
avec le scroll horizontal de 12km c'est vachement plus pratique à lire :D

Reply

Marsh Posté le 12-06-2007 à 18:53:45    

Bonsoir,
 
Je sors, je vais acheter un écran 16/9ème 24"
 
Cordialement

Reply

Marsh Posté le 12-06-2007 à 18:55:42    

seniorpapou a écrit :

Bonsoir,
 
Je sors, je vais acheter un écran 16/9ème 24"
 
Cordialement


Même avec avec mon 24" en 16/10 ça s'arrête à "INNER JOIN (RM_Document..." :D


Message édité par MagicBuzz le 12-06-2007 à 18:55:51
Reply

Marsh Posté le 12-06-2007 à 18:57:07    

Sorti de ça, à vue de nez, ta sous-requête est bonne.
 
Juste que le "IN" replacé par un "=" est suffisant logiquement.

Reply

Marsh Posté le 12-06-2007 à 19:10:05    

merci les amis  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed