cudenetf
Messages postés448Date d'inscriptionmardi 20 septembre 2005StatutMembreDernière intervention26 juillet 2012
-
22 mai 2012 à 13:15
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 2013
-
30 sept. 2012 à 22:04
Bonjour,
j'ai un souci pour selectionner des valeurs de ventes theoriques...
je voudrais afficher les valeurs de stocks ( au prix de vente) par famille de produits
j'ai une table famille de produits
un table article (qui fait reference a famille, avec prix de vente )
une table stock ( pr les qtés)
une table promo (avec date debut,fin, avec la liste des articles en promo :table elem_promo)
s'il y a plusieurs promos sur un article , je voudrais qu'il affiche le prix min
si je veux juste la qte*prix de vente de fiche article je n'ai aps de probleme : je fais :
(select
sum( sa.sa_qte*a1.art_puvttc)
from stock_article as sa join article as a1 on sa.sa_art=a1.art_id
and a1.art_type<>'A' and a1.art_code_gestion='O'
and a1.art_famille=fam_id
)
as stock_vente_ttc,
mais des que je veux rajouter une condition pour savoir si il y a une promo ou non
je n'arrive pas a obtenir de resultat
je veux faire quelque chose du genre :
(select
sum( case when min(ep_prix) is null then sa.sa_qte*a1.art_puvttc else sa.sa_qte*min(ep_prix) end)
from stock_article as sa join article as a1 on sa.sa_art=a1.art_id
and a1.art_type<>'A' and a1.art_code_gestion='O'
and a1.art_famille=fam_id
left join promotion on promo_debut<=getdate() and promo_fin>=getdate()
left join elem_promo on ep_promo=promo_id and ep_art=a1.art_id and ep_art=sa_art
)
as stock_vente_ttc,
mais ca ne me donne rien du tout , l'analyseur de requete ne veut pas du min() et is je met pas min , j'obtiens n'importe quoi comme resultat ( une valeur superieure a valeur sans promotion !!!
ca fait plus de 2 jours qu ej echerche sur internent comment formuler ma requete mais je ne trouve rien
kekeben
Messages postés3Date d'inscriptionmercredi 1 octobre 2008StatutMembreDernière intervention30 mai 20121 30 mai 2012 à 09:44
Salut,
Bon clairement la syntaxe pose pb.
Essaye ça :
select
sum( case when (select count(*) from promotion, ep_promo where ep_promo.promo_id promotion.promo_id and ep_art a1.art_id and promo_debut<=getdate() and promo_fin>=getdate()) > 1 then sa.sa_qte*(select min(ep_prix) from promotion, ep_promo where ep_promo.promo_id = promotion.promo_id and ep_art = a1.art_id and promo_debut<=getdate() and promo_fin>=getdate()) else sa.sa_qte*a1.art_puvttc end)
from stock_article as sa join article as a1 on sa.sa_art=a1.art_id
and a1.art_type<>'A' and a1.art_code_gestion='O'
and a1.art_famille=fam_id
L'idées est de tester dans un case s'il y a des promo en cours (en comptant le nombre de lignes de promo en cours). Si ce compte retourne des valeurs, alors tu sélectionnes le prix minimum parmis les prix possibles de promo en cours. Si pas de retour, pas de promo et donc le prix qui s'applique est le prix normal.
La méthode doit être OK, la requête j'en suis déjà moins certain faute d'avoir les structures de tables complètes.
cudenetf
Messages postés448Date d'inscriptionmardi 20 septembre 2005StatutMembreDernière intervention26 juillet 20122 30 mai 2012 à 11:56
Bonjour, merci pour cette reponse
j'ai don testé... mais j'ai la reponse suivante de sql : "impossible d'executerune fonction d'agregation sur une expression comportant un agregat ou une sous requete ...
je crois que ca vient du "then sa_qte*(select min....)
il ne semble pas aimé ce min a l'interieur du sum( ...
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 20134 30 sept. 2012 à 22:04
Ceci devrais fonctionner :
SELECT
SUM(ISNULL(min_promo.min_ep_prix, a1.art_puvttc) * sa.sa_qte)
FROM article AS a1
INNER JOIN stock_article AS sa
ON sa.sa_art a1.art_id AND a1.art_famille ???.fam_id
LEFT OUTER JOIN (
SELECT elem_promo.ep_art, MIN(elem_promo.ep_prix) AS min_ep_prix
FROM promotion
INNER JOIN elem_promo ON elem_promo.ep_promo = promotion.promo_id
WHERE promotion.promo_debut <= getdate() AND promotion.promo_fin >= getdate()
GROUP BY elem_promo.ep_art
) AS min_promo
ON min_promo.ep_art = a1.art_id
WHERE a1.art_type<>'A' AND a1.art_code_gestion='O'
je fais la sous requette au niveau du SELECT, ca permet d'éviter celle-ci au sein de l'agrégat. je change au passage la syntaxe CASE/WHEN par un ISNULL un peu moins lourd je trouve.
bien-sur , les ??? sont a remplacer par le bon nom de table(sa j'imagine?).