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

[WD8] Problème SQL

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

7 réponses

Avatar
Roumegou
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é)
Avatar
farplus
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
Avatar
Eric
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
Avatar
Roumegou
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é)
Avatar
Eric
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
Avatar
Roumegou
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é)
Avatar
Eric
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