[WD8] Problème SQL

Le
Eric
Bonjour,

Je développe une application gérant la location d'engins de chantier.
Chaque fois qu'un engin est loué ou revient de location, je génère une
écriture dans un fichier mouvements.
Je voudrais obtenir, au moyen d'une requête SQL, la liste de tous les
engins dont le dernier mouvement est antérieur à une date donnée.

Une idée serait la bienvenue.
Merci d'avance.

--
Cordialement
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Roumegou
Le #13417491
Eric avait écrit le 13/04/2004 :
Bonjour,

Je développe une application gérant la location d'engins de chantier.
Chaque fois qu'un engin est loué ou revient de location, je génère une
écriture dans un fichier mouvements.
Je voudrais obtenir, au moyen d'une requête SQL, la liste de tous les
engins dont le dernier mouvement est antérieur à une date donnée.

Une idée serait la bienvenue.
Merci d'avance.



un peu léger comme description ...

Cela sera du genre (en extrapolant sur ton modèle)

Select distinct ENGIN.ENG_NOM FROM MOUVT
INNER JOIN MOUVT ON ENGIN.ENG_ID=MOUVT.ENG_ID
WHERE MOUVT.MVT_DATE<date donnée

Là où cela se compliquera, c'est si tu veux récupérer la date du
dernier mouvement

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
farplus
Le #13417391
Eric vient de nous annoncer :
Bonjour,

Je développe une application gérant la location d'engins de chantier.
Chaque fois qu'un engin est loué ou revient de location, je génère une
écriture dans un fichier mouvements.
Je voudrais obtenir, au moyen d'une requête SQL, la liste de tous les
engins dont le dernier mouvement est antérieur à une date donnée.

Une idée serait la bienvenue.
Merci d'avance.



Cela devrait fonctionner

Select all engin.nom as Nom, mouv.date as date
from engin as Eng, mouv as Mvt
where Eng.identifiant = Mvt.Identifiant
AND mvt.date<datecherchée
group by Nom, date
order by Nom ASC, date DESC

A+

--
Ceci est une signature automatique de MesNews.
Site : http://mesnews.no-ip.com
Eric
Le #13417261
Merci pour vos solutions mais elles me retournent toutes les deux des
engins qui ont été mouvementés avant la date butoir mais qui ont aussi
été mouvementés *après* et c'est là mon problème. Je souhaite récupérer
uniquement ceux qui n'ont pas bougé depuis une date donnée, autrement
dit ceux dont la date du *dernier mouvement* est antérieure à cette
date.

Peut-être que ce n'est pas possible en une seule requête.
--
Cordialement
Roumegou
Le #13417251
Eric a écrit :
Merci pour vos solutions mais elles me retournent toutes les deux des
engins qui ont été mouvementés avant la date butoir mais qui ont aussi
été mouvementés *après* et c'est là mon problème. Je souhaite récupérer
uniquement ceux qui n'ont pas bougé depuis une date donnée, autrement
dit ceux dont la date du *dernier mouvement* est antérieure à cette
date.

Peut-être que ce n'est pas possible en une seule requête.



Tout est possible !

Select ENGIN.ENG_ID, ENGIN.ENG_NOM, MAX(MOUVT.MVT_DATE) FROM MOUVT
INNER JOIN MOUVT ON ENGIN.ENG_ID=MOUVT.ENG_ID
GROUP BY ENGIN.ENG_ID, ENGIN.ENG_NOM
HAVING MAX(MOUVT.MVT_DATE)<date donnée

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Eric
Le #13417221
Le 13 avril 2004 à 17:48, Eric Roumegou nous disait :

Eric a écrit :
Merci pour vos solutions mais elles me retournent toutes les deux des
engins qui ont été mouvementés avant la date butoir mais qui ont aussi
été mouvementés *après* et c'est là mon problème. Je souhaite récupérer
uniquement ceux qui n'ont pas bougé depuis une date donnée, autrement
dit ceux dont la date du *dernier mouvement* est antérieure à cette
date.

Peut-être que ce n'est pas possible en une seule requête.



Tout est possible !

Select ENGIN.ENG_ID, ENGIN.ENG_NOM, MAX(MOUVT.MVT_DATE) FROM MOUVT
INNER JOIN MOUVT ON ENGIN.ENG_ID=MOUVT.ENG_ID
GROUP BY ENGIN.ENG_ID, ENGIN.ENG_NOM
HAVING MAX(MOUVT.MVT_DATE)<date donnée



C'est là que je m'aperçois que j'ai encore du boulot pour maîtriser SQL
:-)
Ça marche (presque) en modifiant "FROM MOUVT" en "FROM ENGIN". En
revanche, c'est la raison de mon « presque », la requête me retourne
bien ENGIN.ENG_ID mais pas ENGIN.ENG_NOM et je ne comprends pas
pourquoi.

En tout cas, merci beaucoup pour le coup de main.

--
Cordialement
Roumegou
Le #13417211
Eric avait énoncé :
Le 13 avril 2004 à 17:48, Eric Roumegou nous disait :

Eric a écrit :
Merci pour vos solutions mais elles me retournent toutes les deux des
engins qui ont été mouvementés avant la date butoir mais qui ont aussi
été mouvementés *après* et c'est là mon problème. Je souhaite récupérer
uniquement ceux qui n'ont pas bougé depuis une date donnée, autrement
dit ceux dont la date du *dernier mouvement* est antérieure à cette
date.

Peut-être que ce n'est pas possible en une seule requête.



Tout est possible !

Select ENGIN.ENG_ID, ENGIN.ENG_NOM, MAX(MOUVT.MVT_DATE) FROM MOUVT
INNER JOIN MOUVT ON MOUVT.ENG_ID=ENGIN.ENG_ID
GROUP BY ENGIN.ENG_ID, ENGIN.ENG_NOM
HAVING MAX(MOUVT.MVT_DATE)<date donnée



C'est là que je m'aperçois que j'ai encore du boulot pour maîtriser SQL
:-)
Ça marche (presque) en modifiant "FROM MOUVT" en "FROM ENGIN".



Attention ! J'ai imaginé ton modèle à savoir une table MOUVT et une
table ENGIN
un ENGIN a plusieurs MOUVT. La relation se fait par la zone ENG_ID qui
est l'identifiant primaire de ENGIN.
On a donc (au minimum)
ENGIN : ENG_ID int(8), ENG_NOM Varchar(50)
MOUVT : MVT_ID int(8), ENG_ID int(8), MVT_DATE Date

En
revanche, c'est la raison de mon « presque », la requête me retourne
bien ENGIN.ENG_ID mais pas ENGIN.ENG_NOM et je ne comprends pas
pourquoi.



Parce que tu as fais sauté la jointure et que j'avais écris une
connerie !
C'est : Select ENGIN.ENG_ID, ENGIN.ENG_NOM, MAX(MOUVT.MVT_DATE)
FROM MOUVT INNER JOIN ENGIN ON MOUVT.ENG_ID=ENGIN.ENG_ID
GROUP BY ENGIN.ENG_ID, ENGIN.ENG_NOM
HAVING MAX(MOUVT.MVT_DATE)<date donnée


En tout cas, merci beaucoup pour le coup de main.



--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Eric
Le #13417191
Le 13 avril 2004 à 19:01, Eric Roumegou nous disait :

Ça marche (presque) en modifiant "FROM MOUVT" en "FROM ENGIN".



Attention ! J'ai imaginé ton modèle à savoir une table MOUVT et une
table ENGIN
un ENGIN a plusieurs MOUVT. La relation se fait par la zone ENG_ID qui
est l'identifiant primaire de ENGIN.



Tu as bien imaginé :-)

En
revanche, c'est la raison de mon « presque », la requête me retourne
bien ENGIN.ENG_ID mais pas ENGIN.ENG_NOM et je ne comprends pas
pourquoi.



Parce que tu as fais sauté la jointure et que j'avais écris une
connerie !
C'est : Select ENGIN.ENG_ID, ENGIN.ENG_NOM, MAX(MOUVT.MVT_DATE)
FROM MOUVT INNER JOIN ENGIN ON MOUVT.ENG_ID=ENGIN.ENG_ID
GROUP BY ENGIN.ENG_ID, ENGIN.ENG_NOM
HAVING MAX(MOUVT.MVT_DATE)<date donnée



Là, ça fonctionne parfaitement ! Merci encore.

--
Cordialement
Publicité
Poster une réponse
Anonyme