Requete/SQL et dates

Le
Rv
Bonjour à tous,

J'ai une requête à écrire mais je tourne autour depuis un moment sans
avancer. Je sais qu'il s'agit d'un forum Access en non purement un forum SQL
mais je tente quand même ma chance.
J'essaye de simplifier pour exposer l'essentiel du problème :
Une seule table A(CodeA, DateEvenement, CodeEvenement, CodeB)
Quelques données en exemple :
CodeA | DateEvenement | CodeEvenement | CodeB
1 01/01/2009 7 2
2 04/09/2008 7 2
3 01/06/2007 4 2
4 08/04/2006 3 2
8 01/01/2007 7 7
12 15/05/2006 3 7
18 10/08/2008 3 9

Je souhaite obtenir, pour chaque CodeB, tous les enregistrements
distincts (CodeEvenement, CodeB) :
- dont la date est supérieure ou égale au 01/07/2008,
- plus l'enregistriment qui précède (dans l'ordre croissant des dates)
cette date s'il existe.

Sur cet exemple le résultat voulu serait:
CodeEvenement | CodeB
7 2
4 2
7 7
3 9

Pour mieux comprendre (autant que possible) cela correspond aux champs
suivant:
CodeA | DateEvenement | CodeEvenement |
CodeB
1 et 2 01/01/2009 et 04/09/2008 7
2
3 01/06/2007 4
2
8 01/01/2007 7
7
18 10/08/2008 3
9

J'espère que cela est compréhensible. Merci par avance pour vos réflexions
et vos réponses.

Rv
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michel__D
Le #18449881
Bonjour,

Rv a écrit :
Bonjour à tous,

J'ai une requête à écrire mais je tourne autour depuis un moment sans
avancer. Je sais qu'il s'agit d'un forum Access en non purement un forum SQL
mais je tente quand même ma chance.
J'essaye de simplifier pour exposer l'essentiel du problème :
Une seule table A(CodeA, DateEvenement, CodeEvenement, CodeB)
Quelques données en exemple :
CodeA | DateEvenement | CodeEvenement | CodeB
1 01/01/2009 7 2
2 04/09/2008 7 2
3 01/06/2007 4 2
4 08/04/2006 3 2
8 01/01/2007 7 7
12 15/05/2006 3 7
18 10/08/2008 3 9

Je souhaite obtenir, pour chaque CodeB, tous les enregistrements
distincts (CodeEvenement, CodeB) :
- dont la date est supérieure ou égale au 01/07/2008,
- plus l'enregistriment qui précède (dans l'ordre croissant des dates)
cette date s'il existe.

Sur cet exemple le résultat voulu serait:
CodeEvenement | CodeB
7 2
4 2
7 7
3 9

Pour mieux comprendre (autant que possible) cela correspond aux champs
suivant:
CodeA | DateEvenement | CodeEvenement |
CodeB
1 et 2 01/01/2009 et 04/09/2008 7
2
3 01/06/2007 4
2
8 01/01/2007 7
7
18 10/08/2008 3
9

J'espère que cela est compréhensible. Merci par avance pour vos réflexions
et vos réponses.



Normalement cette requête devrait te donner le résultat souhaité :

SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Min(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
ORDER BY CodeB
UNION
SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
ORDER BY CodeB;
Rv
Le #18451691
Merci bien Michel pour cette solution.

J'ai légérement modifié la premiere partie de la requete union pour obtenir
tous les enregistrements dont la date est supérieure ou égale au 01/07/08
(utilisation de IN dans la clause WHERE, sans utiliser la fonction max sur
la date) et j'ai diminué le nombre de champs du résultat.
Pour l'instant cette requête fonctionne sur le cas simplifié et cela donne :

SELECT T.CodeEvenement, T.CodeB
FROM Table_A AS T
WHERE T.DateEvenement in (SELECT DateEvenement FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
ORDER BY CodeB
UNION SELECT T.CodeEvenement, T.CodeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
ORDER BY CodeB;

J'essaierai demain de traiter le cas réel qui est bien plus complexe. Je te
tiens au courant de l'avancement mais en tous cas merci encore car j'ai
ainsi une nouvelle piste : j'étais déjà parti sur une requête union mais je
n'avais pas pensé à utiliser la jointure sur le Max des dates inférieures...

A+

Rv

"Michel__D" news: ubR9Lg$
Bonjour,

Rv a écrit :
Bonjour à tous,

J'ai une requête à écrire mais je tourne autour depuis un moment sans
avancer. Je sais qu'il s'agit d'un forum Access en non purement un forum
SQL mais je tente quand même ma chance.
J'essaye de simplifier pour exposer l'essentiel du problème :
Une seule table A(CodeA, DateEvenement, CodeEvenement, CodeB)
Quelques données en exemple :
CodeA | DateEvenement | CodeEvenement | CodeB
1 01/01/2009 7 2
2 04/09/2008 7 2
3 01/06/2007 4 2
4 08/04/2006 3 2
8 01/01/2007 7 7
12 15/05/2006 3 7
18 10/08/2008 3 9

Je souhaite obtenir, pour chaque CodeB, tous les enregistrements
distincts (CodeEvenement, CodeB) :
- dont la date est supérieure ou égale au 01/07/2008,
- plus l'enregistriment qui précède (dans l'ordre croissant des
dates) cette date s'il existe.

Sur cet exemple le résultat voulu serait:
CodeEvenement | CodeB
7 2
4 2
7 7
3 9

Pour mieux comprendre (autant que possible) cela correspond aux
champs suivant:
CodeA | DateEvenement | CodeEvenement |
CodeB
1 et 2 01/01/2009 et 04/09/2008 7 2
3 01/06/2007 4 2
8 01/01/2007 7 7
18 10/08/2008 3 9

J'espère que cela est compréhensible. Merci par avance pour vos
réflexions et vos réponses.



Normalement cette requête devrait te donner le résultat souhaité :

SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Min(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
ORDER BY CodeB
UNION
SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
ORDER BY CodeB;


Michel__D
Le #18453291
Bonjour,

Ma réponse était en phase avec l'exemple fourni, je rappelle le résultat souhaité :

Sur cet exemple le résultat voulu serait:
CodeEvenement | CodeB
7 2
4 2
7 7
3 9



"Rv"
Merci bien Michel pour cette solution.

J'ai légérement modifié la premiere partie de la requete union pour obtenir
tous les enregistrements dont la date est supérieure ou égale au 01/07/08
(utilisation de IN dans la clause WHERE, sans utiliser la fonction max sur
la date) et j'ai diminué le nombre de champs du résultat.
Pour l'instant cette requête fonctionne sur le cas simplifié et cela donne :

SELECT T.CodeEvenement, T.CodeB
FROM Table_A AS T
WHERE T.DateEvenement in (SELECT DateEvenement FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
ORDER BY CodeB
UNION SELECT T.CodeEvenement, T.CodeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
ORDER BY CodeB;

J'essaierai demain de traiter le cas réel qui est bien plus complexe. Je te
tiens au courant de l'avancement mais en tous cas merci encore car j'ai
ainsi une nouvelle piste : j'étais déjà parti sur une requête union mais je
n'avais pas pensé à utiliser la jointure sur le Max des dates inférieures...

A+

Rv

"Michel__D" news: ubR9Lg$
> Bonjour,
>
> Rv a écrit :
>> Bonjour à tous,
>>
>> J'ai une requête à écrire mais je tourne autour depuis un moment sans
>> avancer. Je sais qu'il s'agit d'un forum Access en non purement un forum
>> SQL mais je tente quand même ma chance.
>> J'essaye de simplifier pour exposer l'essentiel du problème :
>> Une seule table A(CodeA, DateEvenement, CodeEvenement, CodeB)
>> Quelques données en exemple :
>> CodeA | DateEvenement | CodeEvenement | CodeB
>> 1 01/01/2009 7 2
>> 2 04/09/2008 7 2
>> 3 01/06/2007 4 2
>> 4 08/04/2006 3 2
>> 8 01/01/2007 7 7
>> 12 15/05/2006 3 7
>> 18 10/08/2008 3 9
>>
>> Je souhaite obtenir, pour chaque CodeB, tous les enregistrements
>> distincts (CodeEvenement, CodeB) :
>> - dont la date est supérieure ou égale au 01/07/2008,
>> - plus l'enregistriment qui précède (dans l'ordre croissant des
>> dates) cette date s'il existe.
>>
>> Sur cet exemple le résultat voulu serait:
>> CodeEvenement | CodeB
>> 7 2
>> 4 2
>> 7 7
>> 3 9
>>
>> Pour mieux comprendre (autant que possible) cela correspond aux
>> champs suivant:
>> CodeA | DateEvenement | CodeEvenement |
>> CodeB
>> 1 et 2 01/01/2009 et 04/09/2008 7 2
>> 3 01/06/2007 4 2
>> 8 01/01/2007 7 7
>> 18 10/08/2008 3 9
>>
>> J'espère que cela est compréhensible. Merci par avance pour vos
>> réflexions et vos réponses.
>
> Normalement cette requête devrait te donner le résultat souhaité :
>
> SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
> FROM Table_A AS T
> WHERE T.DateEvenement = (SELECT Min(DateEvenement) FROM Table_A
> WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
> ORDER BY CodeB
> UNION
> SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
> FROM Table_A AS T
> WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
> WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
> ORDER BY CodeB;




Rv
Le #18453651
Bonjour,

Ce n'était absolument pas une critique mais un retour :-). Le but étant
aussi de coller avec la question posée "..tous les enregistrements dont la
date est supérieure ou égale au 01/07/08...".
Il est vrai que si j'avais mieux construit mon exemple, la question
n'aurait pas donnée lieu à la moindre hésitation.

Comme je le disais précédement ton aide m'est précieuse alors n'ayons
pas de malentendu :-) Merci encore, je commence mes tests...

A+

Rv



"Michel__D" news: gl98l1$3p7$
Bonjour,

Ma réponse était en phase avec l'exemple fourni, je rappelle le résultat
souhaité :

Sur cet exemple le résultat voulu serait:
CodeEvenement | CodeB
7 2
4 2
7 7
3 9



"Rv" news:4977989e$0$9389$
Merci bien Michel pour cette solution.

J'ai légérement modifié la premiere partie de la requete union pour
obtenir
tous les enregistrements dont la date est supérieure ou égale au 01/07/08
(utilisation de IN dans la clause WHERE, sans utiliser la fonction max
sur
la date) et j'ai diminué le nombre de champs du résultat.
Pour l'instant cette requête fonctionne sur le cas simplifié et cela
donne :

SELECT T.CodeEvenement, T.CodeB
FROM Table_A AS T
WHERE T.DateEvenement in (SELECT DateEvenement FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
ORDER BY CodeB
UNION SELECT T.CodeEvenement, T.CodeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
ORDER BY CodeB;

J'essaierai demain de traiter le cas réel qui est bien plus complexe. Je
te
tiens au courant de l'avancement mais en tous cas merci encore car j'ai
ainsi une nouvelle piste : j'étais déjà parti sur une requête union mais
je
n'avais pas pensé à utiliser la jointure sur le Max des dates
inférieures...

A+

Rv

"Michel__D" de
news: ubR9Lg$
> Bonjour,
>
> Rv a écrit :
>> Bonjour à tous,
>>
>> J'ai une requête à écrire mais je tourne autour depuis un moment
>> sans
>> avancer. Je sais qu'il s'agit d'un forum Access en non purement un
>> forum
>> SQL mais je tente quand même ma chance.
>> J'essaye de simplifier pour exposer l'essentiel du problème :
>> Une seule table A(CodeA, DateEvenement, CodeEvenement, CodeB)
>> Quelques données en exemple :
>> CodeA | DateEvenement | CodeEvenement | CodeB
>> 1 01/01/2009 7
>> 2
>> 2 04/09/2008 7
>> 2
>> 3 01/06/2007 4
>> 2
>> 4 08/04/2006 3
>> 2
>> 8 01/01/2007 7
>> 7
>> 12 15/05/2006 3
>> 7
>> 18 10/08/2008 3
>> 9
>>
>> Je souhaite obtenir, pour chaque CodeB, tous les enregistrements
>> distincts (CodeEvenement, CodeB) :
>> - dont la date est supérieure ou égale au 01/07/2008,
>> - plus l'enregistriment qui précède (dans l'ordre croissant des
>> dates) cette date s'il existe.
>>
>> Sur cet exemple le résultat voulu serait:
>> CodeEvenement | CodeB
>> 7 2
>> 4 2
>> 7 7
>> 3 9
>>
>> Pour mieux comprendre (autant que possible) cela correspond aux
>> champs suivant:
>> CodeA | DateEvenement | CodeEvenement
>> |
>> CodeB
>> 1 et 2 01/01/2009 et 04/09/2008 7 2
>> 3 01/06/2007
>> 4 2
>> 8 01/01/2007
>> 7 7
>> 18 10/08/2008 3
>> 9
>>
>> J'espère que cela est compréhensible. Merci par avance pour vos
>> réflexions et vos réponses.
>
> Normalement cette requête devrait te donner le résultat souhaité :
>
> SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
> FROM Table_A AS T
> WHERE T.DateEvenement = (SELECT Min(DateEvenement) FROM Table_A
> WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
> ORDER BY CodeB
> UNION
> SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
> FROM Table_A AS T
> WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
> WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
> ORDER BY CodeB;







Rv
Le #18457861
J'ai appliqué ton idée sur le cas réel que je devais traiter et cela
fonctionne trés bien.
Un grand merci!

A+

Rv

"Michel__D" news: ubR9Lg$
Bonjour,

Rv a écrit :
Bonjour à tous,

J'ai une requête à écrire mais je tourne autour depuis un moment sans
avancer. Je sais qu'il s'agit d'un forum Access en non purement un forum
SQL mais je tente quand même ma chance.
J'essaye de simplifier pour exposer l'essentiel du problème :
Une seule table A(CodeA, DateEvenement, CodeEvenement, CodeB)
Quelques données en exemple :
CodeA | DateEvenement | CodeEvenement | CodeB
1 01/01/2009 7 2
2 04/09/2008 7 2
3 01/06/2007 4 2
4 08/04/2006 3 2
8 01/01/2007 7 7
12 15/05/2006 3 7
18 10/08/2008 3 9

Je souhaite obtenir, pour chaque CodeB, tous les enregistrements
distincts (CodeEvenement, CodeB) :
- dont la date est supérieure ou égale au 01/07/2008,
- plus l'enregistriment qui précède (dans l'ordre croissant des
dates) cette date s'il existe.

Sur cet exemple le résultat voulu serait:
CodeEvenement | CodeB
7 2
4 2
7 7
3 9

Pour mieux comprendre (autant que possible) cela correspond aux
champs suivant:
CodeA | DateEvenement | CodeEvenement |
CodeB
1 et 2 01/01/2009 et 04/09/2008 7 2
3 01/06/2007 4 2
8 01/01/2007 7 7
18 10/08/2008 3 9

J'espère que cela est compréhensible. Merci par avance pour vos
réflexions et vos réponses.



Normalement cette requête devrait te donner le résultat souhaité :

SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Min(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement >= #7/1/2008#)
ORDER BY CodeB
UNION
SELECT T.CodeA, T.DateEvenement, T.CodeEvenement, T.CadeB
FROM Table_A AS T
WHERE T.DateEvenement = (SELECT Max(DateEvenement) FROM Table_A
WHERE CodeB = T.CodeB And DateEvenement < #7/1/2008#)
ORDER BY CodeB;


Michel__D
Le #18458671
Bonjour

Rv a écrit :
J'ai appliqué ton idée sur le cas réel que je devais traiter et cela
fonctionne trés bien.
Un grand merci!




Il n'y a pas de quoi et merci pour le retour.

PS:Ma remarque c'était surtout pour signaler la petite ambiguité qui
s'était glissé dans la demande.
Publicité
Poster une réponse
Anonyme