Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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/07/2011, 09h16   #1
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Par défaut Requête date max, date précédente et valeurs associées

Bonjour à tous,

Je cherche à faire une requête à partir du type de données suivantes :
ID, Date, Valeur.

En fait je voudrais sélectionner pour chaque ID, la date Max avec sa valeur associée et la date précédente à la date max avec sa valeur associée et une différence des 2 valeurs.
C'est-à-dire j'ai ce genre de données ds ma table :

25, 15/01/2010, 6
25, 12/04/2011, 4
25, 13/05/2000, 4
26, 17/12/2000, 3
26, 18/11/2003, 7

Et j'aimerais avoir une requête qui fait ça :
ID, Max(Date), Val Max Date, DateprécDateMax, Val Dateprécdatemax, Diff
25, 12/04/2011, 4, 15/01/2010, 6, -2
26, 18/11/2003, 7, 17/12/2000, 3, 4

Est-ce possible de sélectionner la date précédente à la date max? Et cmt y associer les bonnes valeurs?


S'il n'existe pas de fonction ou de méthode pr sélectionner la date précédente à la date max, les différence entre la date max et la date préc sont tjs de 7 jours, j'ai alors fait cette requête qui "fonctionne" plus ou moins mais elle ne donnera parfois des doubles lignes de date...dûent à la fonction Dateadd imbriquée...

Code :
1
2
3
4
5
6
7
8
9
SELECT Table.ID, Table.Date, Table.Valeur, Table_1.Date, Table_1.Valeur, (Table.Valeur-Table_1.Valeur) AS diff
FROM Table INNER JOIN Table AS Table_1 ON Table.ID = Table_1.ID
WHERE (((Table.DATE) In (Select Max(Date)
From Table
Group by ID)) AND ((Table_1.DATE) In (
SElect Dateadd("d",-7,Max(Date))
From Table
Group by ID)))
GROUP BY Table.ID, Table.Date, Table.Valeur, Table_1.Date, Table_1.Valeur;
Quelqu'un aurait-il une méthode ?
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 13h17   #2
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
Bonjour Nitromard,

si on est sûr que les dates sont espacées de 7 jours, on peut essayer :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT u.id, 
       u.ladatemax, 
       t1.valeur, 
       Dateadd("d", -7, u.ladatemax) AS dateprecedente, 
       t2.valeur                     AS valeurprecedente, 
       t1.valeur - t2.valeur         AS difference 
FROM   ((SELECT id, 
               MAX(ladate) AS ladatemax 
        FROM   latable 
        GROUP  BY id) AS u 
        INNER JOIN latable AS t1 
          ON ( u.ladatemax = t1.ladate ) 
             AND ( u.id = t1.id )) 
       LEFT JOIN latable AS t2 
         ON ( t2.ladate = Dateadd("d", -7, u.ladatemax) ) 
            AND ( u.id = t2.id );

attention à la table [Table] et au champ [Date] qui sont des mots réservés.
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/07/2011, 13h24   #3
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bonjour f-leb,

Merci du conseil pour Table et Date (ce sont des noms fictifs pour simplifier les notations de mon problème ^^).
Je vais tester cela immédiatement.
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 13h39   #4
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Voilà, le test est fait, ça marche impec!
Le problème que j'avais avec l'autre requête n'apparait plus.

Bon par contre j'ai parfois des ID qui n'apparaissent qu'une seule fois dans la table d'origine.
Du genre :

17, 12/12/2006, 4

Du coup la requête les affiches quand mm avec, bien sûr, rien en valeur précédente et du coup rien en Difference.

Cmt faire pr ne pas les faire afficher?

Et pour une date précédente qui serait n'importe quand, vous avez une idée? Un cas similaire déjà rencontré? (si non cela n'a pas d'importance, c'est, on va dire, plus de la culture générale ^^)

Merci en tout cas pour votre aide ^^
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 16h13   #5
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bon avec un simple Is not null ds une condition where à la fin, cela fonctionne très bien ^^.

En tout cas merci bcp.
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 17h51   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
...ou alors en remplaçant le LEFT JOIN par INNER JOIN il me semble que ça marche aussi.

Pour des dates espacées quelconques, c’est un peu plus long :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT u.id, 
       u.ladatemax, 
       t1.valeur, 
       t2.ladate             AS dateprecedente, 
       t2.valeur             AS valeurprecedente, 
       t1.valeur - t2.valeur AS difference 
FROM   ((SELECT id, 
               MAX(ladate) AS ladatemax 
        FROM   latable 
        GROUP  BY id) AS u 
        INNER JOIN latable AS t1 
          ON  u.ladatemax = t1.ladate  
             AND  u.id = t1.id ) 
       INNER JOIN latable AS t2 
         ON u.id = t2.id 
WHERE    t2.ladate  = (SELECT MAX(v.ladate) 
                           FROM   latable v 
                           WHERE  v.id = u.id 
                                  AND v.ladate < u.ladatemax) ;

A tester…
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/07/2011, 08h39   #7
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bonjour,

Ca a l'air de fonctionner ^^!

Merci beaucoup et bonne continuation à vous !
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard 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 00h17.


 
 
 
 
Partenaires

Hébergement Web