Problèmes sur des Case When imbriqués

Signaler
Messages postés
10
Date d'inscription
mardi 23 décembre 2003
Statut
Membre
Dernière intervention
28 novembre 2007
-
cs_Orion01
Messages postés
10
Date d'inscription
mardi 23 décembre 2003
Statut
Membre
Dernière intervention
28 novembre 2007
-
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'.




Merci pour votre aide.
A voir également:

9 réponses

Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
3
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

Pat

 Don't Worry , Be Happy
Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
3
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
@+

Pat

 Don't Worry , Be Happy
Messages postés
10
Date d'inscription
mardi 23 décembre 2003
Statut
Membre
Dernière intervention
28 novembre 2007

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??


Merci beaucoup.
Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
3
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...
Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
3
oups, j'ai oublié un exemple

...
Select Max(Champ1) as champ1, Min(Champ2) as Champ2, Champ3
from table...

si on laisse comme cela, cela plante avec le message que tu as indiqué...

par contre en mettant :
Select Max(Champ1) as champ1, Min(Champ2) as Champ2, Champ3
from table
group by champ3
cela fonctionnera

courage...

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...
Messages postés
10
Date d'inscription
mardi 23 décembre 2003
Statut
Membre
Dernière intervention
28 novembre 2007

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'.

Je desespère.
Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
3
donnes ta requete complete STP...
on va regardé

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...
Messages postés
10
Date d'inscription
mardi 23 décembre 2003
Statut
Membre
Dernière intervention
28 novembre 2007

Je te l'ai envoyé en MP.


Je mettrais la solution ici.


 


Merci.
Messages postés
10
Date d'inscription
mardi 23 décembre 2003
Statut
Membre
Dernière intervention
28 novembre 2007

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 !!

Merci à pneau pour sa présieuce aide ;-)