CASE dans T-SQL

Résolu
soleil_levant Messages postés 426 Statut Membre -  
soleil_levant Messages postés 426 Statut Membre -
Bonjour,
Je souhaite utiliser un SWITCh dans une requête SQL, on m'a dis que CASE est la solution, J'essaie de faire une sorte de sélection d'instruction WHERE selon la valeur de mon paramètre @Moth, mais ça ne marche pas et d'entrée mon Editeur de base me dis qu'il y un erreur dans l'opérateur IN, voici mon code :

(pr info) Le but est de basculer entre l'année en cour et l'année précédente pr sélectionner toujours les 4 mois glissant
....
IF @Month <> ''
AND @type_declaration LIKE '%REC%'
BEGIN
SELECT MTCN, Account, SendPayIndicator, PayDateLOCDay, PayDateLOCMonth, ..
WHERE T.SendPayIndicator = 'P'
AND
(
CASE @Month

WHEN 1 THEN T.PayDateLOCMonth IN(9, 10, 11, 12)
AND T.PayDateLOCYear = YEAR(GETDATE()) - 1

WHEN 2 THEN ((T.PayDateLOCMonth IN(10, 11, 12)
AND T.PayDateLOCYear = YEAR(GETDATE()) - 1)
OR (T.PayDateLOCMonth IN(1)
AND T.PayDateLOCYear = YEAR(GETDATE())))

WHEN 3 THEN ((T.PayDateLOCMonth IN(12, 11)
AND T.PayDateLOCYear = YEAR(GETDATE()) - 1)
OR (T.T.PayDateLOCMonth IN(1, 2)
AND T.PayDateLOCYear = YEAR(GETDATE())))
WHEN 4 THEN ((T.PayDateLOCMonth IN(12)
AND T.PayDateLOCYear = YEAR(GETDATE()) - 1)
OR (T.PayDateLOCMonth IN(1, 2, 3)
AND T.PayDateLOCYear = YEAR(GETDATE())))

ELSE ...
END
)

Quelqu'un a une idée s'il vous plaît??
Merci d'avance
Configuration: Windows XP Internet Explorer 8.0

4 réponses

  1. moderno31 Messages postés 900 Statut Membre 92
     
    Hello, tu peux m'expliquer de nouveau j'ai pas compris ce que tu veux faire.
    Tu es sur que ton case est bien placé ? Je ne crois pas. Plutot dans le select non ?
    S'il s'agit de switcher sur plusieurs mois différents c'est dans ton programme que tu le gère ça
    0
    1. soleil_levant Messages postés 426 Statut Membre 32
       
      Re
      ça serre à quoi de me poser des questions sur mon problème et vous enfuir après et plus me répondre :( c'est pas trop cool
      a+
      0
  2. soleil_levant Messages postés 426 Statut Membre 32
     
    Bonjour,

    Effectivement, je veux switcher entre les mois et année, c'est clair que le Case est mal placé, c'est une idée de ma part alors elle s'avère pas correcte. Mais le but est la.

    Le but est de sélectionner les donnée sur 4 mois glissant. Si mon paramètre vaut 5 (mois avril) je dois sélectionner tjrs le mois antérieure et les 3 mois qui précédent. Si mon paramètre mois vaut 4, je sélectionne pour le mois 3 (mars) et la je dois réculer et entrer dans l'année antérieure pr prendre aussi le mois de 12 (décembre) ... Il faut généraliser donc tous les cas de figure.

    Avez vous une idée s'il vour plaît.

    Merci infiniment
    0
  3. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    Bonjour soleil_levant,

    Peut-être que le code suivant devrait faire ce que tu veux
    declare @Month1 smallint
    declare @Month2 smallint
    declare @Month3 smallint
    declare @Month4 smallint
    declare @Year1 smallint
    declare @Year2 smallint
    declare @Year3 smallint
    declare @Year4 smallint
    IF @Month <> ''
    AND @type_declaration LIKE '%REC%'
    BEGIN
    set @Month1 = @Month - 1
    set @Year1 = YEAR(GETDATE())
    If @Month1 = 0
    BEGIN
    set @Month1 = 12
    set @Year1 = @Year1 - 1
    END
    set @Month2 = @Month1 - 1
    set @Year2 = @Year1
    If @Month2 = 0
    BEGIN
    set @Month2 = 12
    set @Year2 = @Year2 - 1
    END
    set @Month3 = @Month2 - 1
    set @Year3 = @Year2
    If @Month3 = 0
    BEGIN
    set @Month3 = 12
    set @Year3 = @Year3 - 1
    END
    set @Month4 = @Month3 - 1
    set @Year4 = @Year3
    If @Month4 = 0
    BEGIN
    set @Month4 = 12
    set @Year4 = @Year4 - 1
    END
    SELECT MTCN, Account, SendPayIndicator, PayDateLOCDay, PayDateLOCMonth, ..
    WHERE T.SendPayIndicator = 'P' 
         AND ((T.PayDateLocMonth = @Month1 AND T.PayDateLOCYear = @Year1) OR
                 (T.PayDateLocMonth = @Month2 AND T.PayDateLOCYear = @Year2) OR
                 (T.PayDateLocMonth = @Month3 AND T.PayDateLOCYear = @Year3) OR
                 (T.PayDateLocMonth = @Month4 AND T.PayDateLOCYear = @Year4))
    END
    

    J'ai testé ce code sur une table SQL SERVER , pas avec les mêmes variables mais cela fais (je pense) ce que tu veux. Cela suppose aussi que ton paramètre @Month est du type smallint
    A plus
    0
  4. soleil_levant Messages postés 426 Statut Membre 32
     
    Salut Christounet,
    MErci à toi Christounet mon sauveur :)

    En faite j'ai trouvé une solution depuis, elle ressemble à la tienne .. lol pas trop, la tienne beaucoup mieux.
    Voici la mienne:
    DECLARE @mois int, @type_declaration char(50)

    SET @mois = 8 /* La j'affecte le mois manuellement, c'est le but en faite*/
    SET @type_declaration = 'REC' /* le type de déclaration aussi */

    IF @mois NOT IN(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    PRINT 'Saisir une Date comprise entre 1 et 12'

    ELSE IF @mois = 1
    BEGIN
    SELECT MTCN, SendPayIndicator
    FROM qryTransactionDetails T
    WHERE T.SendPayIndicator = 'P'
    AND T.PayDateLOCYear = YEAR(GETDATE()) - 1
    AND T.PayDateLOCMonth BETWEEN 9 AND 12
    AND T.Adjustment_ID = '-1'
    END
    --ELSE
    --PRINT 'Ca ne serre à rien'

    ELSE IF @mois = 2

    BEGIN

    SELECT MTCN, SendPayIndicator
    FROM qryTransactionDetails T
    WHERE T.SendPayIndicator = 'P'
    AND ((T.PayDateLOCYear = YEAR(GETDATE()) - 1
    AND T.PayDateLOCMonth BETWEEN 10 AND 12 )
    OR
    (T.PayDateLOCYear = YEAR(GETDATE())
    AND T.PayDateLOCMonth = 1))
    AND T.Adjustment_ID = '-1'
    END

    ELSE IF @mois = 3

    BEGIN
    SELECT MTCN, SendPayIndicator
    FROM qryTransactionDetails T
    WHERE T.SendPayIndicator = 'P'
    AND ((T.PayDateLOCYear = YEAR(GETDATE()) - 1
    AND T.PayDateLOCMonth BETWEEN 11 AND 12)
    OR
    (T.PayDateLOCYear = YEAR(GETDATE())
    AND T.PayDateLOCMonth BETWEEN 1 AND 2))
    AND T.Adjustment_ID = '-1'
    END

    ELSE IF @mois = 4

    BEGIN
    SELECT MTCN, SendPayIndicator
    FROM qryTransactionDetails T
    WHERE T.SendPayIndicator = 'P'
    AND ((T.PayDateLOCYear = YEAR(GETDATE()) - 1
    AND T.PayDateLOCMonth = 12)
    OR (T.PayDateLOCYear = YEAR(GETDATE())
    AND T.PayDateLOCMonth BETWEEN 1 AND 3))
    AND T.Adjustment_ID = '-1'
    END
    ..manque le meme type pr le reste des mois.
    GO

    MErci Christounet,

    MILLE MERCI!!
    Je vais la tester demain, mais la syntaxe, l'ergonomie du code est bien meilleure!!

    A+
    0