begin process at 2012 05 27 00:43:10
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

SQL Server, MSDE, SQL Express

 > 

Requêtes

 > 

Problèmes sur des Case When imbriqués


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problèmes sur des Case When imbriqués

mercredi 28 novembre 2007 à 13:21:55 | Problèmes sur des Case When imbriqués

Orion01

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.

mercredi 28 novembre 2007 à 13:37:33 | Re : Problèmes sur des Case When imbriqués

pneau

Membre Club
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
mercredi 28 novembre 2007 à 13:39:03 | Re : Problèmes sur des Case When imbriqués

pneau

Membre Club
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
mercredi 28 novembre 2007 à 15:29:45 | Re : Problèmes sur des Case When imbriqués

Orion01

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.

mercredi 28 novembre 2007 à 15:35:00 | Re : Problèmes sur des Case When imbriqués

pneau

Membre Club
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


lorsque le problème est résolu, pensez Réponse Acceptée  et un petit message en plus n'est pas de refus...
mercredi 28 novembre 2007 à 15:37:05 | Re : Problèmes sur des Case When imbriqués

pneau

Membre Club
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


lorsque le problème est résolu, pensez Réponse Acceptée  et un petit message en plus n'est pas de refus...
mercredi 28 novembre 2007 à 16:10:07 | Re : Problèmes sur des Case When imbriqués

Orion01

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.
mercredi 28 novembre 2007 à 16:16:20 | Re : Problèmes sur des Case When imbriqués

pneau

Membre Club

donnes ta requete complete STP...
on va regardé

Pat

 Don't Worry , Be Happy


lorsque le problème est résolu, pensez Réponse Acceptée  et un petit message en plus n'est pas de refus...
mercredi 28 novembre 2007 à 16:24:54 | Re : Problèmes sur des Case When imbriqués

Orion01

Je te l'ai envoyé en MP.

Je mettrais la solution ici.

 

Merci.

mercredi 28 novembre 2007 à 18:47:34 | Re : Problèmes sur des Case When imbriqués

Orion01

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 ;-)


Cette discussion est classée dans : case, when, prd, else, then


Répondre à ce message

Sujets en rapport avec ce message

Case dans une clause where [ par yaya2669 ] Bonjour, Je cherche a faire une requete de ce genre : ----------- Select Case when Matable1.Desc = 'Desc1' then '1' when Matable1.Desc = ' Somme en sql [ par yaya2669 ] Bonjour,Voila la requete de baseSelect 'Montant'=Case WHEN T0.PRICE=100 then 10 else 20 end,'Montant2'=Case WHEN T0.PRICEFROM ITM1 T0Je voudrais maint SQL CASE WHEN [ par fafal ] Hello J'ai un problème avec cette requete...SELECT CASE Result WHEN >0 THEN 96-RESULT ELSE 96 END as testJe voudrai que QUAND RESULT est un chiffre al Instruction CASE [ par casy ] Salut à tous,J'ai une question probablement un peu con, mais bon; Je dois mettre en production dans peu de temps et je n'ai pas la base production pou Problème incorrect syntax near '=' [ par waluigi44 ] Bonjour, je débute dans les requetes SQL. Voici mon code qui m'envoie l'erreur suivant ncorrect syntax near '=' [code=autre] UPDATE dbo.Nop_Add CASE WHEN avec opérateur IN [ par bossun ] salut j'ai un peu de peine à écrire une requete sql avec un case when dans une clause where... [size=100] SELECT max(ResultsID) FROM panoram Case or not Case [ par quinquin59 ] BOnjour, je bloque sur un truc sur une base de donnée access. voici mon probléme J'ai une table A avec les champs QuotientD ,QuotientF, Valeurs J'ai u sous requête dans CASE [ par citt ] Bonjour, Est il possible de faire des sous requêtes dans le THEN d'un case ? J'ai des table du genre produits - ID - Nom - ID_User1 - ID_User2 use lire contenu d'une case d'une BDD ODBC [ par ju0123456789 ] Bonjour,Pourriez-vous me dire comment je peux lire le contenu d'une case de ma base de donnée ODBC SVP ?Je susi en train de faire une confirmation d'i Multi requete sql et champ repeter PHP [ par inkydjango ] Slt a tous !! Une nouvelle colle pour les boss !! Je dois creer un tableau sur lequel je dois inserer plusieurs requete sql sur un zone repetée: je


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,618 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales