Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requete/SQL et dates

6 réponses
Avatar
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

6 réponses

Avatar
Michel__D
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;
Avatar
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" a écrit dans le message 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;


Avatar
Michel__D
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" a écrit dans le message de 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" a écrit dans le message 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;




Avatar
Rv
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" a écrit dans le message de
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" a écrit dans le message de
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" a écrit dans le message
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;







Avatar
Rv
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" a écrit dans le message 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;


Avatar
Michel__D
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.