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

Requête avec DateDiff minimale

8 réponses
Avatar
Chichile
Bonjour,

Je cale dans la mise au point d'une requ=EAte bas=E9e sur 2 tables...

Mes 2 tables : une avec des donn=E9es d'analyses de labo v=E9t=E9rinaire et
l'autre avec des donn=E9es sur les troupeaux d'o=F9 sont issus les animaux
test=E9s (inventaire des nombres d'animaux pr=E9sents =E0 des dates
donn=E9es). Les dates d'inventaire ne correspondent pas aux dates
d'=E9chantillonnage pour analyse mais j'aimerais pr=E9senter pour chaque
analyse les donn=E9es de l'inventaire le plus proche (que ce soit avant
ou apr=E8s l'=E9chantillonnage).

tblANALYSES a
- Troupeau
- Date_Echantillonnage

tblTROUPEAU t : donn=E9es d'inventaires (plusieurs inventaires par
troupeau)
- ID_troupeau
- Date_Inventaire
- No_animaux

Je voudrais avoir dans mon SELECT :
a=2Etroupeau, a.date_analyse, t.date_inventaire , t.No_animaux
et il faut donc que
Abs(DateDiff("d",a.Date_Echantillonnage,t.Date_Inventaire) soit
minimale.

Quelqu'un aurait-il une id=E9e =E0 me sugg=E9rer pour parvenir =E0 ce
r=E9sultat ?
D'avance un grand merci !
C=E9cile

8 réponses

Avatar
Pierre CFI [mvp]
bonjour
tu enleves les champs date inv et date echantil, tu passes en req
regroupement (clic sur le sigma) et dans le champ de datediif, tu met Min,
comme opération, regroupement dans les autres
j'enléve les dates, car elles sont diff donc pas de regroupement possible

--
Pierre
MVP Access
***************************************
Conseils MPFA: http://www.mpfa.info/
*********************************************************
"Chichile" a écrit dans le message de news:

Bonjour,

Je cale dans la mise au point d'une requête basée sur 2 tables...

Mes 2 tables : une avec des données d'analyses de labo vétérinaire et
l'autre avec des données sur les troupeaux d'où sont issus les animaux
testés (inventaire des nombres d'animaux présents à des dates
données). Les dates d'inventaire ne correspondent pas aux dates
d'échantillonnage pour analyse mais j'aimerais présenter pour chaque
analyse les données de l'inventaire le plus proche (que ce soit avant
ou après l'échantillonnage).

tblANALYSES a
- Troupeau
- Date_Echantillonnage

tblTROUPEAU t : données d'inventaires (plusieurs inventaires par
troupeau)
- ID_troupeau
- Date_Inventaire
- No_animaux

Je voudrais avoir dans mon SELECT :
a.troupeau, a.date_analyse, t.date_inventaire , t.No_animaux
et il faut donc que
Abs(DateDiff("d",a.Date_Echantillonnage,t.Date_Inventaire) soit
minimale.

Quelqu'un aurait-il une idée à me suggérer pour parvenir à ce
résultat ?
D'avance un grand merci !
Cécile
Avatar
Chichile
Bonjour,

Sorry, mais là je ne suis pas sûre de bien comprendre.J'avais commenc é
dans cette direction (voir SQL ci-dessous) mais je ne voyais pas trop
qu'en faire. Pourrais-tu expliciter ?

D'une part, j'ai besoin des dates, d'autre part, je ne peux pas non
plus grouper les no_animaux pour la même raison que les dates... Je
cherche en effet à obtenir :
a.troupeau - a.date_analyse - t.date_inventaire - t.No_animaux
troupeau 1 - 10/02/2005 - 15/12/2004 - 35

Un grand merci d'avance !

Cécile

(SELECT Min(Abs(DateDiff("d",[tblANALYSES]![Date_Echantillonnage],
[tblTROUPEAU]![Date_Inventaire]))) AS Diff, tblANALYSES.[Troupeau]
FROM tblANALYSES LEFT JOIN tblTROUPEAU ON tblANALYSES.[Troupeau] =
tblTROUPEAU.ID_Troupeau
GROUP BY tblANALYSES.[Troupeau];)
Avatar
Chichile
oups, je corrige : date_echantillonnage et non date_analyse...

Bonjour,

Sorry, mais là je ne suis pas sûre de bien comprendre.J'avais commenc é
dans cette direction (voir SQL ci-dessous) mais je ne voyais pas trop
qu'en faire. Pourrais-tu expliciter ?

D'une part, j'ai besoin des dates, d'autre part, je ne peux pas non
plus grouper les no_animaux pour la même raison que les dates... Je
cherche en effet à obtenir :
a.troupeau - a.date_echantillonnage - t.date_inventaire - t.No_animaux
troupeau 1 - 10/02/2005 - 15/12/2004 - 35

Un grand merci d'avance !

Cécile

(SELECT Min(Abs(DateDiff("d",[tblANALYSES]![Date_Echantillonnage],
[tblTROUPEAU]![Date_Inventaire]))) AS Diff, tblANALYSES.[Troupeau]
FROM tblANALYSES LEFT JOIN tblTROUPEAU ON tblANALYSES.[Troupeau] =
tblTROUPEAU.ID_Troupeau
GROUP BY tblANALYSES.[Troupeau];)
Avatar
Jessy Sempere
Bonjour

Ce SQL devrait fonctionner je pense :

SELECT a.troupeau, a.date_echantillonnage, First(t.date_inventaire) AS
PremierDedate_inventaire, First(t.No_animaux) AS PremierDeNo_animau
FROM a INNER JOIN t ON a.troupeau = t.id_troupeau
GROUP BY a.troupeau, a.date_echantillonnage
ORDER BY a.troupeau,
First(Abs(DateDiff("d",[date_echantillonnage],[date_inventaire])));


@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"Chichile" a écrit dans le message de news:

oups, je corrige : date_echantillonnage et non date_analyse...

Bonjour,

Sorry, mais là je ne suis pas sûre de bien comprendre.J'avais commencé
dans cette direction (voir SQL ci-dessous) mais je ne voyais pas trop
qu'en faire. Pourrais-tu expliciter ?

D'une part, j'ai besoin des dates, d'autre part, je ne peux pas non
plus grouper les no_animaux pour la même raison que les dates... Je
cherche en effet à obtenir :
a.troupeau - a.date_echantillonnage - t.date_inventaire - t.No_animaux
troupeau 1 - 10/02/2005 - 15/12/2004 - 35

Un grand merci d'avance !

Cécile

(SELECT Min(Abs(DateDiff("d",[tblANALYSES]![Date_Echantillonnage],
[tblTROUPEAU]![Date_Inventaire]))) AS Diff, tblANALYSES.[Troupeau]
FROM tblANALYSES LEFT JOIN tblTROUPEAU ON tblANALYSES.[Troupeau] tblTROUPEAU.ID_Troupeau
GROUP BY tblANALYSES.[Troupeau];)
Avatar
Michel_D
Bonjour,

Comme je présume que l'initiateur du fil veut l'information pour tous les
animaux (t.No_animaux), il faut passer par une requête intermédiaire
(regroupement sur t.id_troupeau pour isoler la date d'inventaire la plus
proche relative au troupeau) ensuite dans une 2ème requête
(regroupement sur t.No_animaux), rajouter dans une jointure le résultat
de cette requête intermédiaire.

PS: Si j'ai le temps j'essaierai de fournir les requêtes.


"Jessy Sempere" a écrit dans le message de news:
Bonjour

Ce SQL devrait fonctionner je pense :

SELECT a.troupeau, a.date_echantillonnage, First(t.date_inventaire) AS
PremierDedate_inventaire, First(t.No_animaux) AS PremierDeNo_animau
FROM a INNER JOIN t ON a.troupeau = t.id_troupeau
GROUP BY a.troupeau, a.date_echantillonnage
ORDER BY a.troupeau,
First(Abs(DateDiff("d",[date_echantillonnage],[date_inventaire])));


@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"Chichile" a écrit dans le message de news:

oups, je corrige : date_echantillonnage et non date_analyse...

Bonjour,

Sorry, mais là je ne suis pas sûre de bien comprendre.J'avais commencé
dans cette direction (voir SQL ci-dessous) mais je ne voyais pas trop
qu'en faire. Pourrais-tu expliciter ?

D'une part, j'ai besoin des dates, d'autre part, je ne peux pas non
plus grouper les no_animaux pour la même raison que les dates... Je
cherche en effet à obtenir :
a.troupeau - a.date_echantillonnage - t.date_inventaire - t.No_animaux
troupeau 1 - 10/02/2005 - 15/12/2004 - 35

Un grand merci d'avance !

Cécile

(SELECT Min(Abs(DateDiff("d",[tblANALYSES]![Date_Echantillonnage],
[tblTROUPEAU]![Date_Inventaire]))) AS Diff, tblANALYSES.[Troupeau]
FROM tblANALYSES LEFT JOIN tblTROUPEAU ON tblANALYSES.[Troupeau] > tblTROUPEAU.ID_Troupeau
GROUP BY tblANALYSES.[Troupeau];)





Avatar
Chichile
Bonjour,

J'ai eu des tâches plus urgentes ce qui explique mon absence, mais je
pédale encore dans le choucroute...

L'idée de Jessie me paraissait séduisante, mais ça ne fonctionne pas.
Il faut que je précise qu'il peut y avoir plusieurs tests par troupeau
à des dates différentes et ceci n'est peut-être pas étranger à
l'affaire...

Michel : on s'est mal compris . No_animaux est en fait un nombre
d'animaux présents dans l'exploitation pour un inventaire. Mais nous
sommes d'accord, j'ai ailleurs par troupeau plusieurs ID_animal testés
et je devrai faire une autre requête pour ça.
Cependant je cale sur la première partie : attribuer à un troupeau
pour une date d'échantillonnage x la date d'inventaire y la plus
proche de x...

A suivre...
Cécile
Avatar
Michel_D
Bonjour,

J'ai eu des tâches plus urgentes ce qui explique mon absence, mais je
pédale encore dans le choucroute...

L'idée de Jessie me paraissait séduisante, mais ça ne fonctionne pas.
Il faut que je précise qu'il peut y avoir plusieurs tests par troupeau
à des dates différentes et ceci n'est peut-être pas étranger à
l'affaire...

Michel : on s'est mal compris . No_animaux est en fait un nombre
d'animaux présents dans l'exploitation pour un inventaire. Mais nous
sommes d'accord, j'ai ailleurs par troupeau plusieurs ID_animal testés
et je devrai faire une autre requête pour ça.
Cependant je cale sur la première partie : attribuer à un troupeau
pour une date d'échantillonnage x la date d'inventaire y la plus
proche de x...

A suivre...
Cécile


Bonjour,

Bon, même si je suis peut-être à coté de la plaque,
je te fournis tout de même ces 2 requêtes.

La 1ère requête nommé "rTmp" permet pour chaque [No_animaux] de
déterminer la [Date_Echantillonnage] relative à un troupeau la
plus récente ainsi que la différence minimum entre cette
[Date_Echantillonnage] et la [Date_Inventaire].

Requête rTmp
SELECT [t].ID_troupeau, [t].No_animaux,
Max(a.Date_Echantillonnage) AS Date_Echantillonnage,
Min(Abs(DateDiff("d",a.Date_Echantillonnage,[t].Date_Inventaire))) AS Diff
FROM tblTROUPEAU AS t INNER JOIN tblANALYSES AS a
ON [t].ID_troupeau=a.Troupeau
GROUP BY [t].ID_troupeau, [t].No_animaux
ORDER BY [t].ID_troupeau, [t].No_animaux;

La derniére requête fournit par [No_animaux] appartenant à un
[ID_troupeau] la [Date_Echantillonnage] la plus récente ainsi que
la [Date_Inventaire] la plus proche de cette [Date_Echantillonnage].

SELECT r.ID_troupeau, r.Date_Echantillonnage,
Max([t].Date_Inventaire) AS Date_Inventaire, r.No_animaux
FROM rTmp AS r INNER JOIN tblTroupeau AS t
ON (r.No_animaux=[t].No_animaux) AND (r.ID_troupeau=[t].ID_troupeau)
WHERE (Abs(DateDiff("d",r.Date_Echantillonnage,[t].Date_Inventaire))=r.Diff)
GROUP BY r.ID_troupeau, r.No_animaux, r.Date_Echantillonnage
ORDER BY r.ID_troupeau, r.No_animaux, r.Date_Echantillonnage;

Avatar
Chichile
Bonjour,

Voilà mon problème s'est finalement résolu grâce à un petit modul e en
VBA...
Merci quand même pour vos suggestions !

Public Function fctDateInvent(ByVal Troupeau As Long, ByVal
Date_Echant As Date) As Variant

Dim db As DAO.Database, rst As DAO.Recordset, Dte As Date

Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM Inventaires WHERE IdTroupeau
= " & Troupeau, dbOpenDynaset)
Dte = #1/1/1950#
While Not rst.EOF
If Abs(DateDiff("d", Date_Echant, rst("Date_Invent"))) <
Abs(DateDiff("d", Date_Echant, Dte)) Then Dte = rst("Date_Invent")
rst.MoveNext
Wend

rst.Close

fctDateInvent = IIf(Dte > #1/1/1950#, Dte, Null)

Set rst = Nothing
Set db = Nothing
End Function