cs_Orion01
Messages postés10Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention28 novembre 2007
-
28 nov. 2007 à 13:21
cs_Orion01
Messages postés10Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention28 novembre 2007
-
28 nov. 2007 à 18:47
Bonjour,
J'ai un souci sur des case when que je veux imbriquer.
Je suis sous SQL7 et le code suivant se trouve dans une vue.
select
case
when prd.cdrescmr like 'SM%' then
case
when prd.cdtypprdach = '01' then
case
when prd.ctcan = 'NOP' then min(prd.pxvteeurtr3)
else max(prd.pxvteeurtr3) -- pxvteeurtr3 = prix de vente des colis standards en SM
end
else
case
when prd.ctcan = 'NOP' then min(prd.pxvteeurcmptr3)
else max(prd.pxvteeurcmptr3) -- pxvteeurcmptr3 = prix de vente des composants en SM
end
end
else
case
when prd.cdtypprdach = '01' then
case
when prd.ctcan = 'NOP' then min(prd.pxvtegeneur)
else max(prd.pxvtegeneur) -- pxvtegeneur = prix de vente des colis standards en HM
end
else
case
when prd.ctcan = 'NOP' then min(prd.pxvtegen)
else max(prd.pxvtegen) -- pxvtegen = prix de vente des composants en HM
end
end
as PrxVenteTTC
from table prd
where...
Est il possible d'imbriquer des case when comme ca??
Parce que dans cette version de code j'ai le message d'erreur suivant :
Server: Msg 156, Level 15, State 1, Procedure export_plana_All2, Line 166
Incorrect syntax near the keyword 'as'.
pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 20105 28 nov. 2007 à 13:37
salt
apres vérif rapide, il semblerait qu'il te manque un "END" sur l'un de tes case
select
case when prd.cdrescmr like 'SM%' then
case when prd.cdtypprdach = '01' then
case when prd.ctcan = 'NOP' then min(prd.pxvteeurtr3)
else max(prd.pxvteeurtr3) -- pxvteeurtr3 = prix de vente des colis standards en SM
end
else
case
when prd.ctcan = 'NOP' then min(prd.pxvteeurcmptr3)
else max(prd.pxvteeurcmptr3) -- pxvteeurcmptr3 = prix de vente des composants en SM
end
end
else
case when prd.cdtypprdach = '01' then
case when prd.ctcan = 'NOP' then min(prd.pxvtegeneur)
else max(prd.pxvtegeneur) -- pxvtegeneur = prix de vente des colis standards en HM
end
else
case
when prd.ctcan = 'NOP' then min(prd.pxvtegen)
else max(prd.pxvtegen) -- pxvtegen = prix de vente des composants en HM
end
end
END
pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 20105 28 nov. 2007 à 13:39
re,
petite précision sur SQL 7... le moteur n'est pas très performant et les requetes complexes peuvent poser des soucis..
si tu en as la possibilité passe au moins à la version SQL 2000.. pour info, MSDE 2000 est gratuit, sinon, tu as la version
SQL Express 2005 est gratuite également
@+
cs_Orion01
Messages postés10Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention28 novembre 2007 28 nov. 2007 à 15:29
Effectivement, il manquait un end!!
Bien vu ;-)
Et pour SQL2000 : je sais!!
Je lutte corps et ame au travail pour migrer.
Par contre, j'ai corrigé le probleme et maintenant ma vue ne veut toujours pas se lancer!
J'ai des erreurs sur les champs du select :
Server: Msg 8118, Level 16, State 1, Procedure export_plana_All2, Line 11
Column 'col.anssrcll' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Donc ???
Car avant ce case when, ca marchait tres bien??
pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 20105 28 nov. 2007 à 15:35
re,
en fait dans ton "Case When" tu utilises des fonctions (Max, Min) qui ne permette de ramener qu'un seul enregistrement suivant les critères définis. hors, si tu ajoutes dans ton select d'autres champs, ces derniers peuvent avoir des valeurs multiples, donc il est obligatoire, pour respecter les clauses, Max et Min, que tu utilises un Group By pour les autres champs.
si tu ne le souhaites pas, tu seras obligé de réécrire ta requete différement.
@+
Pat
Don't Worry , Be Happy
<hr />lorsque le problème est résolu, pensez Réponse Acceptée et un petit message en plus n'est pas de refus...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Orion01
Messages postés10Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention28 novembre 2007 28 nov. 2007 à 16:10
Bon je viens de prendre en compte ta remarque.
Donc tous les champs qui sont renommés (donc avec un AS quelque chose) ne doivent pas etre repris dans le group by. C'est bien ca?
Et moi, ben j'ai que des champs renommés.
Ce qui fait que si je laisse comme avant, ben ca plante et si je fait un group by mes champs renommés, ben ca plante aussi en me disant ceci :
Server: Msg 207, Level 16, State 1, Procedure export_plana_All2, Line 11
Invalid column name 'CHAMPX'.
cs_Orion01
Messages postés10Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention28 novembre 2007 28 nov. 2007 à 18:47
Voila la solution :
A cause du min/max sur le prix de vente qui ne renvoi qu'un seul enregistrement alors que le select en renvoi plusieurs, il faut obligatoirement pour respecter les clauses min/max, utiliser un Group By pour les autres champs.
Par contre, dans la liste des champs du Group By, il faut mettre T O U S les champs utilisés dans les Case When !!!!
RQ : ne pas mettre les allias (AS) dans le Group By !!