IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Problème avec des Case When imbriqués


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 22
    Points
    22
    Par défaut Problème avec des Case When imbriqués
    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.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Server: Msg 156, Level 15, State 1, Procedure export_plana_All2, Line 166
    Incorrect syntax near the keyword 'as'.
    Merci pour votre aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 22
    Points
    22
    Par défaut
    Merci pour cette réponse.
    Je viens d'essayer et a priori c'est bon!
    Sauf que maintenant j'ai une erreur sur la virgule qui suit le dernier end. Car j'ai d'autres champs qui suivent ce groupe de case.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select champ1, groupe case, champ2 from prd...
    Le message est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Server: Msg 170, Level 15, State 1, Procedure export_plana_All2, Line 165
    Line 165: Incorrect syntax near ','.

  3. #3
    Membre actif
    Inscrit en
    Février 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 185
    Points : 224
    Points
    224
    Par défaut
    Desolé, j'ai supprimé ma précedente reponse par erreur:
    je disais qu'il fallait mettre l'alias avant le case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SELECT 'PrxVenteTTC'=
    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	
     
    FROM TABLE prd
    WHERE...

    Pour ta nouvelle erreur, il serait préferable que tu postes l'ensemble de ta requete (avec les champs que tu veux ajouter)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 22
    Points
    22
    Par défaut
    Ok voila le code "un peu allegé" (car je peux pas tout montrer...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
                 select distinct
                 pxtarbseeur as PA, 
    	'PrxVenteTTC' = 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) 
    			end
    		else 
    			case 
    			when prd.ctcan = 'NOP' then min(prd.pxvteeurcmptr3)
    			else max(prd.pxvteeurcmptr3) 
    			end
    		end
    	else 
    	case 
    	when prd.cdtypprdach = '01' then 
    		case 
    		when prd.ctcan = 'NOP' then min(prd.pxvtegeneur)
    		else max(prd.pxvtegeneur) 
    		end
    	else 
    		case 
    		when prd.ctcan = 'NOP' then min(prd.pxvtegen)
    		else max(prd.pxvtegen) 
    		end
    	end,   <== ERREUR !!!!!!!!!!!!!!!!!!!
    	pxachfaceur as PB   
                 from prd

    L'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Server: Msg 170, Level 15, State 1, Procedure export_plana_All2, Line 165
    Line 165: Incorrect syntax near ','.

    Merci.

  5. #5
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 70
    Points
    70
    Par défaut
    a mon avis, la position de l'alias ne pose pas de soucis, tu peux très bien mettre AS derrière le dernier END, par contre il me semble qu'il manque un END dans ton imbrication de CASE WHEN !

    ESSAYE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
              SELECT DISTINCT
                 pxtarbseeur AS PA, 
    	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) 
    			end
    		else 
    			case 
    			when prd.ctcan = 'NOP' then min(prd.pxvteeurcmptr3)
    			else max(prd.pxvteeurcmptr3) 
    			end
    		end
    	else 
    	case 
    	when prd.cdtypprdach = '01' then 
    		case 
    		when prd.ctcan = 'NOP' then min(prd.pxvtegeneur)
    		else max(prd.pxvtegeneur) 
    		end
    	else 
    		case 
    		when prd.ctcan = 'NOP' then min(prd.pxvtegen)
    		else max(prd.pxvtegen) 
    		end
    	end
    END AS PrxVenteTTC, 
    	pxachfaceur AS PB   
                 FROM prd

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 22
    Points
    22
    Par défaut
    Effectivement, il manquait un end!!
    Bien vu

    Merci beaucoup.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 22
    Points
    22
    Par défaut
    J'ai eus d'autres soucis avec les Case When...
    Je vous mets 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 !!

Discussions similaires

  1. Problème avec des SQLDataReaders imbriqués
    Par Catsloveuse dans le forum Accès aux données
    Réponses: 0
    Dernier message: 11/05/2010, 10h10
  2. Problème avec des #include imbriqués
    Par Ph.denis dans le forum C++
    Réponses: 6
    Dernier message: 16/03/2008, 10h15
  3. Problèmes avec des cases à cocher et une liste déroulante
    Par rob2-9 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/01/2006, 10h52
  4. [STRUTS] Problème avec des ActionForm
    Par zarbydigital dans le forum Struts 1
    Réponses: 2
    Dernier message: 29/03/2004, 13h49
  5. Problèmes avec des vues
    Par dady dans le forum MFC
    Réponses: 22
    Dernier message: 09/01/2004, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo