Requête avec DateDiff minimale

Le
Chichile
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
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
Pierre CFI [mvp]
Le #6309051
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"
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
Chichile
Le #6308981
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];)
Chichile
Le #6308971
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];)
Jessy Sempere
Le #6308831
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"
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];)
Michel_D
Le #6308781
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"
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"
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];)





Chichile
Le #6395361
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
Michel_D
Le #6322781
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;

Chichile
Le #6322141
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
Publicité
Poster une réponse
Anonyme