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

Signaler
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
-
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
-
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

3 réponses

Messages postés
3
Date d'inscription
mercredi 1 octobre 2008
Statut
Membre
Dernière intervention
30 mai 2012
1
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
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012

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( ...
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
3
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?).