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

Développement SQL Server Discussion :

Utilisation de la clause WHERE CASE WHEN ELSE END dans une procédure stockée [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 338
    Par défaut Utilisation de la clause WHERE CASE WHEN ELSE END dans une procédure stockée
    Bonjour
    Toujours dans ma quête d'étudier les procédures stockées, j'ai écrit ceci
    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
     
    CREATE PROCEDURE [dbo].[ChiffreDeAffaire] 
    	-- Add the parameters for the stored procedure here
    	@NombrePeriodeCompare as int,
    	@PeriodeComparee as nvarchar(25),
    	@PeriodeFin as int,
    	@Annee as int
    AS
    BEGIN
    	declare @Inc as int
    	set @inc=1
    	if @PeriodeComparee='TRIMESTRE'
    	begin
    		while @inc<=@NombrePeriodeCompare
    		begin
    			if @Periodefin-@inc<0
    			begin
    				SELECT cast(@Periodefin-@inc+5 as nvarchar)+'° TRIMESTRE '+cast(@Annee-1 as nvarchar) as Periode,'ACHAT' as Elt,sum(V) as	Valeur,@Periodefin-@inc as NbPeriode,'Montant' as NomValeur,0 as Ordre from chiffre_d_affaire_achat where (case
    	when @Periodefin-@inc+5=1 then month(dateoperation)<=3
    	when @Periodefin-@inc+5=2 then month(dateoperation) between 4 and 6
    	when @Periodefin-@inc+5=3 then month(dateoperation) between 7 and 9
    	else month(dateoperation)>9 end) and (year(dateoperation)=@annee-1) group by month(dateoperation)
    			end
    		end
     
    		set @Inc=@Inc+1
    	end
    END
    GO
    A l'exécution, voilà le message d'erreur qu'il affiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*102, Niveau*15, État*1, Procédure*ChiffreDeAffaire, Ligne*23
    Syntaxe incorrecte vers '<'.
    Y a t il une manière d'utiliser la clause CASE WHEN THEN ELSE END après le WHERE?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 133
    Par défaut
    case...endne peut pas retourner de valeur booléenne.
    Tu peux en revanche faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    where @Periodefin - @inc + 5 = case when month(dateoperation)<=3 then 1
    	when month(dateoperation) between 4 and 6 then 2
    	when month(dateoperation) between 7 and 9 then 3 end
    C'est une piste... je n'ai pas traité le dernier cas (>9)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 338
    Par défaut
    Merci pour la piste. Ca m'a permis de sortir une bricole vu que c'est sur la valeur de month(dateoperation) que je fais le filtre selon celle de @Periodefin-@inc+5. Voilà la bricole

    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
    CREATE PROCEDURE [dbo].[ChiffreDeAffaire] 
    	-- Add the parameters for the stored procedure here
    	@NombrePeriodeCompare as int,
    	@PeriodeComparee as nvarchar(25),
    	@PeriodeFin as int,
    	@Annee as int
    AS
    BEGIN
    	declare @Inc as int
    	set @inc=1
    	if @PeriodeComparee='TRIMESTRE'
    	begin
    		while @inc<=@NombrePeriodeCompare
    		begin
    			if @Periodefin-@inc<0
    			begin
    				SELECT cast(@Periodefin-@inc+5 as nvarchar)+'° TRIMESTRE '+cast(@Annee-1 as nvarchar) as Periode,'ACHAT' as Elt,sum(V) as
    Valeur,@Periodefin-@inc as NbPeriode,'Montant' as NomValeur,0 as Ordre from chiffre_d_affaire_achat where (month(dateoperation) <= case
    	when @Periodefin-@inc+5=1 then 3 end) or ((month(dateoperation)>=case
    	when @Periodefin-@inc+5=2 then 4 end) and (month(dateoperation)<=case
    	when @Periodefin-@inc+5=2 then 6 end)) or ((month(dateoperation)>=case
    	when @Periodefin-@inc+5=3 then 7 end) and (month(dateoperation)<=case
    	when @Periodefin-@inc+5=3 then 9 end)) or (month(dateoperation) >= case
    	when @Periodefin-@inc+5=4 then 10 end) and (year(dateoperation)=@annee-1) group by month(dateoperation)
    			end
    		end
     
    		set @Inc=@Inc+1
    	end
    END
    GO
    Ne peut-on pas organiser normalement ce cafouillage?

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 338
    Par défaut
    dans l'esprit de mon post précédent, ne peut-on pas avoir un seul case

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Je pense que le CASE WHEN n'est pas utile ici et complique les choses. Pourquoi ne pas faire une serie de prédicats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WHERE 
    	(@Periodefin-@inc+5=1 AND month(dateoperation)<=3)
    	OR (@Periodefin-@inc+5=2 AND month(dateoperation) between 4 and 6)
    	OR( @Periodefin-@inc+5=3 AND month(dateoperation) between 7 and 9)
    	OR(month(dateoperation)>9 ) and (year(dateoperation)=@annee-1))

    Mais a mon avis, vous pouvez même faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE
    (MONTH(dateoperation) - 1) / 3 = @Periodefin-@inc+4

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 338
    Par défaut
    c'était une bonne piste. Merci bcp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. IF ELSE dans une Procédure Stockée
    Par Marc_27 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/10/2012, 09h47
  2. Réponses: 9
    Dernier message: 28/05/2011, 15h47
  3. Pb de requete SQL avec clauses WHERE dans une procédure stockée
    Par CocoLeNain dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/06/2010, 23h48
  4. Réponses: 1
    Dernier message: 12/12/2007, 13h46
  5. Réponses: 6
    Dernier message: 05/04/2007, 13h35

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