Requete sql avec sum case when, min etc...

cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 22 mai 2012 à 13:15
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 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
A voir également:

3 réponses

kekeben Messages postés 3 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 30 mai 2012 1
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.

Tiens nous au courant
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
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( ...
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
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?).
0
Rejoignez-nous