OVH Cloud OVH Cloud

WD8/9: aux spécialistes de SQL

10 réponses
Avatar
I.G.LOG
Bonjour,
Un problème SQL: comment peut on avoir la liste des clients dont la dernière
commande a été passée dans une période donnée ?
select * from CLIENT, COMMANDE where COMMANDE.IDCLIENT = CLIENT.IDCLIENT and
COMMANDE.DATE between '20000101' and '20000201' va me retourner toutes les
commandes de la periode mais pas la dernière commande passée dans cette
periode !
Merci à tous

10 réponses

Avatar
ManuPavy
I.G.LOG wrote:

Bonjour,
Un problème SQL: comment peut on avoir la liste des clients dont la dernière
commande a été passée dans une période donnée ?
select * from CLIENT, COMMANDE where COMMANDE.IDCLIENT = CLIENT.IDCLIENT and
COMMANDE.DATE between '20000101' and '20000201' va me retourner toutes les
commandes de la periode mais pas la dernière commande passée dans cette
periode !
Merci à tous




... ORDER BY COMMANDE.DATE DESC LIMIT 1
ca devrait faire l affaire

Manu
Avatar
Manu
"I.G.LOG" wrote in message
news:41fa21c3$0$18847$
Bonjour,
Un problème SQL: comment peut on avoir la liste des clients dont la


dernière
commande a été passée dans une période donnée ?
select * from CLIENT, COMMANDE where COMMANDE.IDCLIENT = CLIENT.IDCLIENT


and
COMMANDE.DATE between '20000101' and '20000201' va me retourner toutes les



pour moi je dirais :

selecxt IDCLIENT
from COMMANDE
group by IDCLIENT
having max(COMMANDE.DATE ) between '20000101' and '20000201'
Avatar
Philippe Lienart
I.G.LOG a formulé ce vendredi :
Bonjour,
Un problème SQL: comment peut on avoir la liste des clients dont la dernière
commande a été passée dans une période donnée ?
select * from CLIENT, COMMANDE where COMMANDE.IDCLIENT = CLIENT.IDCLIENT and
COMMANDE.DATE between '20000101' and '20000201' va me retourner toutes les
commandes de la periode mais pas la dernière commande passée dans cette
periode !
Merci à tous



Dans quelle base de données travailles-tu.
En MySQL je ne vois pas de problème car le champ date existe, mais en
SQLServeur il s'agit d'une champ dateheure et il se peut que la date ne
soit pas enregistrée sous le format YYYYMMAA000000 mais bien avec une
heure différente de zéro.
Il s'en suit que la fonction between ne prend en compte que les dates
entre les dates indiquées mais en y ajoutant des 0 pour les heures,
minutes ,...
Pour le début de la période cela ne pose pas de problème mais pour la
fin de période cela peut créer un problème.
J'utilise donc souvent >= date début et < date fin + 1 jour.
:-) :-) :-)

--
A+

PhL
Avatar
ManuPavy
>
pour moi je dirais :

selecxt IDCLIENT
from COMMANDE
group by IDCLIENT
having max(COMMANDE.DATE ) between '20000101' and '20000201'



Oui, je viens de m'apercevoir que ce que je proposais rendait uniquement
LA derniere commande (tout client confondu).

Manu
Avatar
digging
Philippe Lienart a exposé le 28/01/2005 :
I.G.LOG a formulé ce vendredi :
Bonjour,
Un problème SQL: comment peut on avoir la liste des clients dont la
dernière
commande a été passée dans une période donnée ?
select * from CLIENT, COMMANDE where COMMANDE.IDCLIENT = CLIENT.IDCLIENT
and
COMMANDE.DATE between '20000101' and '20000201' va me retourner toutes les
commandes de la periode mais pas la dernière commande passée dans cette
periode !
Merci à tous



Dans quelle base de données travailles-tu.
En MySQL je ne vois pas de problème car le champ date existe, mais en
SQLServeur il s'agit d'une champ dateheure et il se peut que la date ne soit
pas enregistrée sous le format YYYYMMAA000000 mais bien avec une heure
différente de zéro.
Il s'en suit que la fonction between ne prend en compte que les dates entre
les dates indiquées mais en y ajoutant des 0 pour les heures, minutes ,...
Pour le début de la période cela ne pose pas de problème mais pour la fin de
période cela peut créer un problème.
J'utilise donc souvent >= date début et < date fin + 1 jour.
:-) :-) :-)



Avec SQL Server, regarde la syntaxe de DATEDIFF, il n'y a aucun
problème.

--
- concepteur ensemblier -
Avatar
I.G.LOG
> > selecxt IDCLIENT
> from COMMANDE
> group by IDCLIENT
> having max(COMMANDE.DATE ) between '20000101' and '20000201'

Oui, je viens de m'apercevoir que ce que je proposais rendait uniquement
LA derniere commande (tout client confondu).



"(tout client confondu)" cette requete va retourner une seule ligne ?! Je
cherche bien à avoir toutes les dernières commandes durant la période de
chaque client ! Est-ce la solution ?
PS: pour ceux qui ont posé la question, je travaille avec MySQL.
Avatar
I.G.LOG
Je travaille avec MySQL.
select CLIENT.IDCLIENT from CLIENT,CLICOM where CLICOM.IDCLIENT CLIENT.IDCLIENT group by IDCLIENT having max(CLICOM.DATE) between '20040101'
and '20041231'
select IDCLIENT from CLICOM group by IDCLIENT having max(DATE) between
'20040101' and '20041231'
les des deux requetes ne me retourne rien alors qu'il y a bien des lignes
qui correspondent dans la table !
essais réalisé sous WD9 et MySQL Control Center
Avatar
ManuPavy
I.G.LOG wrote:

selecxt IDCLIENT
from COMMANDE
group by IDCLIENT
having max(COMMANDE.DATE ) between '20000101' and '20000201'



Oui, je viens de m'apercevoir que ce que je proposais rendait uniquement
LA derniere commande (tout client confondu).




"(tout client confondu)" cette requete va retourner une seule ligne ?! Je
cherche bien à avoir toutes les dernières commandes durant la période de
chaque client ! Est-ce la solution ?
PS: pour ceux qui ont posé la question, je travaille avec MySQL.




C'est bien pour cela qu il faut utiliser la requete de ... Manu (ah
merde, t as peut etre cru qu on etait qu un !?) ; celle ci dessus.

Manu
Avatar
ManuPavy
I.G.LOG wrote:

Je travaille avec MySQL.
select CLIENT.IDCLIENT from CLIENT,CLICOM where CLICOM.IDCLIENT > CLIENT.IDCLIENT group by IDCLIENT having max(CLICOM.DATE) between '20040101'
and '20041231'
select IDCLIENT from CLICOM group by IDCLIENT having max(DATE) between
'20040101' and '20041231'
les des deux requetes ne me retourne rien alors qu'il y a bien des lignes
qui correspondent dans la table !
essais réalisé sous WD9 et MySQL Control Center



essaie avec ... between '2004-01-01' and '2004-12-31'

Manu
Avatar
I.G.LOG
> essaie avec ... between '2004-01-01' and '2004-12-31'



Super ca a l'air d'être ça ! Merci Manu