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

question bete

9 réponses
Avatar
Etienne SOBOLE
j'ai une grosse table avec des ligne contenant
une ref, un prix, une date un client

on me demande de selectionner tous les derniers prix pour un client donné.
alors moi j'ai fait un

SELECT ref, prix, max(date) from line_produit where idclient = 1234 group by
ref, prix;

sauf qu'evidement ca me sort plusieurs fois les ref si les prix on changé au
court du temps!!!
comment on fait la requete dont j'ai besoin ?

Merci.
Etienne

9 réponses

Avatar
ALain Montfranc
Etienne SOBOLE a écrit
j'ai une grosse table avec des ligne contenant
une ref, un prix, une date un client

on me demande de selectionner tous les derniers prix pour un client donné.
alors moi j'ai fait un

SELECT ref, prix, max(date) from line_produit where idclient = 1234 group by
ref, prix;

sauf qu'evidement ca me sort plusieurs fois les ref si les prix on changé au
court du temps!!!
comment on fait la requete dont j'ai besoin ?

Merci.
Etienne




Comme ca, en Q'ND (pas testé) :

select l.ref, l.prix, l.date
from
line_produit l,
( select ref, max(date) as date from line_produit where idclient =
1234 group by ref) d
where
l.ref = d.ref and l.date = d.date and idclient = 1234
Avatar
Etienne SOBOLE
select l.ref, l.prix, l.date
from
line_produit l,
( select ref, max(date) as date from line_produit where idclient = 1234
group by ref) d
where
l.ref = d.ref and l.date = d.date and idclient = 1234



Super c'est tout bon merci.

Mais alors j'ai un nouveau probleme,
vu que ma requete plantait finalement ils ont trouvé ca sympa d'avoir aussi
les prix précédents, mais ils n'en voudraient que deux ou trois...
donc, et la, ca semble quand meme plus compliqué, est il possible en une
seule requete de sortir les 3 derniers prix d'un meme article et ca pour
tous les articles acheté par le client !

merci
Etienne
Avatar
ALain Montfranc
Etienne SOBOLE a écrit
select l.ref, l.prix, l.date
from
line_produit l,
( select ref, max(date) as date from line_produit where idclient = 1234
group by ref) d
where
l.ref = d.ref and l.date = d.date and idclient = 1234



Super c'est tout bon merci.

Mais alors j'ai un nouveau probleme,
vu que ma requete plantait finalement ils ont trouvé ca sympa d'avoir aussi
les prix précédents, mais ils n'en voudraient que deux ou trois...
donc, et la, ca semble quand meme plus compliqué, est il possible en une
seule requete de sortir les 3 derniers prix d'un meme article et ca pour tous
les articles acheté par le client !

merci
Etienne



J'ai une solution assez ignoble mais qui fonctionne sous Oracle (c'est
quoi ton SGBD ?)

L'idee est de travailler avec une sous requete qui ramene un
identifiant de ligne :

On y va. Déjà :

select ref, date from line_produit where idclient = 1234
order by ref, date desc

te donne pour un client donné, la liste de tous les prix de chaque
référence, triée par date décroissante (les plus récentes en premier)

Maitenant si tu fais :

select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)

Tu obtiens cette meme liste prefixée avec un numéro d'ordre. Il faut
maitenant récupérer le bon n° d'ordre de chaque reference :

select min(id) as id, ref from
(
select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
)
group by ref

Maintenant comme tu en veux (au maximum) 3 par reference, on va ajouter
2 à l'ID :


select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref


Maintenant en faisant une jointure de cette table avec la premiere on
va pouvoir récuperer les 3 derniers prix :

select prix.ref, prix.date, prix.prix
from
(
select rownum as id, ref, date, prix from
(
select ref, date, prix from line_produit where idclient = 1234
order by ref, date desc
)
) prix,
(
select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref
) ids
where
prix.ref = ids.ref
and prix.id <= ids.id
order by prix.ref, prix.date

Je sais, c'est ignoble :-D

(j'ai pas testé sur cette structure de table donc il y a peut etre des
frottes de fappe, mais en suivant le principe tu devrais y arriver)
Avatar
Etienne SOBOLE
Ca marche presque !!!

C'est pas mal, mais ca ne marche que si j'ai au moins 3 prix !!! sinon je
passe a la référence suivante !!!
mais bon c'etait bien tenté.

laisse beton je vais faire ca a la main je pense.
Etienne

"ALain Montfranc" a écrit dans le message de news:

Etienne SOBOLE a écrit
select l.ref, l.prix, l.date
from
line_produit l,
( select ref, max(date) as date from line_produit where idclient =
1234 group by ref) d
where
l.ref = d.ref and l.date = d.date and idclient = 1234



Super c'est tout bon merci.

Mais alors j'ai un nouveau probleme,
vu que ma requete plantait finalement ils ont trouvé ca sympa d'avoir
aussi les prix précédents, mais ils n'en voudraient que deux ou trois...
donc, et la, ca semble quand meme plus compliqué, est il possible en une
seule requete de sortir les 3 derniers prix d'un meme article et ca pour
tous les articles acheté par le client !

merci
Etienne



J'ai une solution assez ignoble mais qui fonctionne sous Oracle (c'est
quoi ton SGBD ?)

L'idee est de travailler avec une sous requete qui ramene un identifiant
de ligne :

On y va. Déjà :

select ref, date from line_produit where idclient = 1234
order by ref, date desc

te donne pour un client donné, la liste de tous les prix de chaque
référence, triée par date décroissante (les plus récentes en premier)

Maitenant si tu fais :

select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)

Tu obtiens cette meme liste prefixée avec un numéro d'ordre. Il faut
maitenant récupérer le bon n° d'ordre de chaque reference :

select min(id) as id, ref from
(
select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
)
group by ref

Maintenant comme tu en veux (au maximum) 3 par reference, on va ajouter 2
à l'ID :


select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref


Maintenant en faisant une jointure de cette table avec la premiere on va
pouvoir récuperer les 3 derniers prix :

select prix.ref, prix.date, prix.prix
from
(
select rownum as id, ref, date, prix from
(
select ref, date, prix from line_produit where idclient = 1234
order by ref, date desc
)
) prix,
(
select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref
) ids
where
prix.ref = ids.ref
and prix.id <= ids.id
order by prix.ref, prix.date

Je sais, c'est ignoble :-D

(j'ai pas testé sur cette structure de table donc il y a peut etre des
frottes de fappe, mais en suivant le principe tu devrais y arriver)


Avatar
Gilles TOURREAU
Le Thu, 20 Sep 2007 16:36:04 +0200, Etienne SOBOLE a
écrit:

Ca marche presque !!!

C'est pas mal, mais ca ne marche que si j'ai au moins 3 prix !!! sinon je
passe a la référence suivante !!!
mais bon c'etait bien tenté.

laisse beton je vais faire ca a la main je pense.
Etienne

"ALain Montfranc" a écrit dans le message de news:

Etienne SOBOLE a écrit
select l.ref, l.prix, l.date
from
line_produit l,
( select ref, max(date) as date from line_produit where idclient >>>> 1234 group by ref) d
where
l.ref = d.ref and l.date = d.date and idclient = 1234



Super c'est tout bon merci.

Mais alors j'ai un nouveau probleme,
vu que ma requete plantait finalement ils ont trouvé ca sympa d'avoir
aussi les prix précédents, mais ils n'en voudraient que deux ou
trois...
donc, et la, ca semble quand meme plus compliqué, est il possible en
une
seule requete de sortir les 3 derniers prix d'un meme article et ca
pour
tous les articles acheté par le client !

merci
Etienne



J'ai une solution assez ignoble mais qui fonctionne sous Oracle (c'est
quoi ton SGBD ?)

L'idee est de travailler avec une sous requete qui ramene un identifiant
de ligne :

On y va. Déjà :

select ref, date from line_produit where idclient = 1234
order by ref, date desc

te donne pour un client donné, la liste de tous les prix de chaque
référence, triée par date décroissante (les plus récentes en premier)

Maitenant si tu fais :

select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)

Tu obtiens cette meme liste prefixée avec un numéro d'ordre. Il faut
maitenant récupérer le bon n° d'ordre de chaque reference :

select min(id) as id, ref from
(
select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
)
group by ref

Maintenant comme tu en veux (au maximum) 3 par reference, on va ajouter
2
à l'ID :


select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref


Maintenant en faisant une jointure de cette table avec la premiere on va
pouvoir récuperer les 3 derniers prix :

select prix.ref, prix.date, prix.prix
from
(
select rownum as id, ref, date, prix from
(
select ref, date, prix from line_produit where idclient = 1234
order by ref, date desc
)
) prix,
(
select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref
) ids
where
prix.ref = ids.ref
and prix.id <= ids.id
order by prix.ref, prix.date

Je sais, c'est ignoble :-D

(j'ai pas testé sur cette structure de table donc il y a peut etre des
frottes de fappe, mais en suivant le principe tu devrais y arriver)









Pouvez-vous cependant indiquer sur quel SGBD vous tournez ???

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Etienne SOBOLE
POSTGRESQL

rownum n'existe pas, mais peut etre crée a partir d'une sequence.
A+

"Gilles TOURREAU" a écrit dans le message de news:

Le Thu, 20 Sep 2007 16:36:04 +0200, Etienne SOBOLE a
écrit:

Ca marche presque !!!

C'est pas mal, mais ca ne marche que si j'ai au moins 3 prix !!! sinon je
passe a la référence suivante !!!
mais bon c'etait bien tenté.

laisse beton je vais faire ca a la main je pense.
Etienne

"ALain Montfranc" a écrit dans le message de news:

Etienne SOBOLE a écrit
select l.ref, l.prix, l.date
from
line_produit l,
( select ref, max(date) as date from line_produit where idclient >>>>> 1234 group by ref) d
where
l.ref = d.ref and l.date = d.date and idclient = 1234



Super c'est tout bon merci.

Mais alors j'ai un nouveau probleme,
vu que ma requete plantait finalement ils ont trouvé ca sympa d'avoir
aussi les prix précédents, mais ils n'en voudraient que deux ou
trois...
donc, et la, ca semble quand meme plus compliqué, est il possible en
une
seule requete de sortir les 3 derniers prix d'un meme article et ca
pour
tous les articles acheté par le client !

merci
Etienne



J'ai une solution assez ignoble mais qui fonctionne sous Oracle (c'est
quoi ton SGBD ?)

L'idee est de travailler avec une sous requete qui ramene un identifiant
de ligne :

On y va. Déjà :

select ref, date from line_produit where idclient = 1234
order by ref, date desc

te donne pour un client donné, la liste de tous les prix de chaque
référence, triée par date décroissante (les plus récentes en premier)

Maitenant si tu fais :

select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)

Tu obtiens cette meme liste prefixée avec un numéro d'ordre. Il faut
maitenant récupérer le bon n° d'ordre de chaque reference :

select min(id) as id, ref from
(
select rownum as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
)
group by ref

Maintenant comme tu en veux (au maximum) 3 par reference, on va ajouter
2
à l'ID :


select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref


Maintenant en faisant une jointure de cette table avec la premiere on va
pouvoir récuperer les 3 derniers prix :

select prix.ref, prix.date, prix.prix
from
(
select rownum as id, ref, date, prix from
(
select ref, date, prix from line_produit where idclient = 1234
order by ref, date desc
)
) prix,
(
select min(id)+2 as id, ref from
(
select ref, date from line_produit where idclient = 1234
order by ref, date desc
)
group by ref
) ids
where
prix.ref = ids.ref
and prix.id <= ids.id
order by prix.ref, prix.date

Je sais, c'est ignoble :-D

(j'ai pas testé sur cette structure de table donc il y a peut etre des
frottes de fappe, mais en suivant le principe tu devrais y arriver)









Pouvez-vous cependant indiquer sur quel SGBD vous tournez ???

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
ALain Montfranc
Etienne SOBOLE a écrit
Ca marche presque !!!

C'est pas mal, mais ca ne marche que si j'ai au moins 3 prix !!! sinon je
passe a la référence suivante !!!




T'aurais pas oublié le prix.ref = ids.ref final ?

Parce que je viens de tester (Oracle) et ca marche...
Avatar
Patrick Texier
Le Thu, 20 Sep 2007 16:52:24 +0200, Etienne SOBOLE a ajouté deux lignes
au dessus de 130 :

POSTGRESQL

rownum n'existe pas, mais peut etre crée a partir d'une sequence.



Bon, les cochons avant de poursuivre cette discussion, vous serait-il
possible de lire
<http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html> ?
Avatar
Patrick Mevzek
Le Wed, 19 Sep 2007 14:10:11 +0200, Etienne SOBOLE a écrit:
vu que ma requete plantait finalement ils ont trouvé ca sympa d'avoir aussi
les prix précédents, mais ils n'en voudraient que deux ou trois...
donc, et la, ca semble quand meme plus compliqué, est il possible en une
seule requete de sortir les 3 derniers prix d'un meme article et ca pour
tous les articles acheté par le client !



Quelque chose de ce style devrait fonctionner :
(cela fonctionne dans mes tests sous PostgreSQL)

SELECT lp2.* FROM ((SELECT DISTINCT ref FROM line_produit WHERE client) AS lp1
INNER JOIN line_produit AS lp2
ON (lp1.ref=lp2.ref AND lp2.date IN (SELECT date FROM line_produit WHERE ref=lp1.ref ORDER BY date DESC LIMIT 3)))
ORDER BY ref,date DESC;

Ca risque de coincer s'il y a deux changements de prix à la même date (pour une même référence) :
il faudra alors corriger le ORDER BY du deuxième sous-select pour être sûr
de récupérer les prix qui intéressent vraiment (peut-être un tri supplémentaire sur le prix ?)

Le truc en SQL pour s'y retrouver (en tout cas l'astuce qui m'aide perso)
c'est de se dire qu'une boucle en langage procédural quelconque correspond
à une jointure en SQL.

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>