question bete

Le
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
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
ALain Montfranc
Le #21861591
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
Etienne SOBOLE
Le #21861561
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
ALain Montfranc
Le #21861541
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)
Etienne SOBOLE
Le #21861531
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"
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)


Gilles TOURREAU
Le #21861521
Le Thu, 20 Sep 2007 16:36:04 +0200, Etienne SOBOLE é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"
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
Etienne SOBOLE
Le #21861511
POSTGRESQL

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

"Gilles TOURREAU"
Le Thu, 20 Sep 2007 16:36:04 +0200, Etienne SOBOLE é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"
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
ALain Montfranc
Le #21861501
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...
Patrick Texier
Le #21861491
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
Patrick Mevzek
Le #21861481
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
Dépêches sur le nommage
Publicité
Poster une réponse
Anonyme