2010-02-02 7 views
0

Ceci est une version simplifiée de ce que je fais, mais je ne peux rien obtenir au travail. La déclaration me donne une erreur sans la virgule après 'ERR'. Je veux que la colonne soit 'Mois' et je pense que cela fonctionnera mais j'ai beaucoup de problèmes. Merci de votre aide!Déclaration de cas avec plusieurs fois ... ne fonctionne pas!

 
    select 
a.POL_PRI_RSK_ST_CD, a.MASTER_COMPANY_NBR, 

case 

when a.char046 is NULL then 'ERR' 

when a.char046 > '010' then '11+' 

else a.char046 end as Policy_Years, 

a.Last7Days, a.Last30Days, a.Last90Days 

from reporting a inner join 

Repository b 

on a.RECORD_ID = b.RECORD_ID 

where a.POL_OGN_EFF_DT >= '2008-11-01' 

group by 

a.POL_PRI_RSK_ST_CD, a.MASTER_COMPANY_NBR, 

case 

when a.char046 is NULL then 'ERR' 

when a.char046 > '010' then '11+' 

else a.char046 end as Policy_Years, 

a.Last7Days, a.Last30Days, a.Last90Days
+0

Quelle erreur obtenez-vous après avoir enlevé la virgule? – Heinzi

+1

END AS MONTH me donne: Syntaxe incorrecte près de ','. Après avoir enlevé la virgule j'obtiens: L'identificateur en plusieurs parties "day" n'a pas pu être lié. – Daniel

+1

@Daniel: Cette erreur n'a rien à voir avec votre instruction CASE - il y a un problème avec votre clause "day". Montrez-nous la déclaration SQL complète, et nous pouvons travailler à corriger cela. – Heinzi

Répondre

2

Remarque: Ceci est le résultat de la session de débogage dans les commentaires de la question.

L'erreur Incorrect syntax near the keyword 'as'. a été provoquée par as Policy_Years dans la clause GROUP BY. Vous n'êtes pas autorisé à utiliser as dans une clause GROUP BY.

2

Essayez-le sans virgule ... exemple à suivre.

select 
    case 
     when a.month is NULL then 'ERR' 
     when a.month > '011' then '12' 
     else a.month 
    end as Month, 
    a.Last7Days 
from ... 
+0

Sans les virgules me donne ce message immédiatement pour chaque jour, année, etc. Msg 4104, niveau 16, état 1, ligne 1 L'identificateur en plusieurs parties "jour" n'a pas pu être lié. – Daniel

+0

Les virgules sont toujours requises pour séparer les colonnes du jeu d'enregistrements renvoyé. Vous n'avez simplement pas besoin d'eux dans la déclaration de cas. – Mayo

+0

droite, je voulais dire sans une virgule après «ERR». même erreur – Daniel

0
select 
    day, year, 
case 
    when a.month is NULL then 'ERR' 
    when a.month > '011' then '12' 
    else a.month end as Month, 
a.Last7Days 
+0

toujours obtenir des erreurs. voir au dessus. – Daniel

0

Je pense que vous manquez 'AS' après la fin de l'affaire.

+0

Comme c'est facultatif, pas nécessaire ... –

0

Fixer les virgules:

select 
    day, year, 
    case 
     when a.month is NULL then 'ERR' 
     when a.month > '011' then '12' 
     else a.month 
    end Month, 
    a.Last7Days 
from [table] 
0

crochets Mettre carrés autour Day et Year, comme ceci:

select a.[Day], a.[Year], ... 
+0

c'est juste un exemple, le jour n'est pas dans la déclaration réelle – Daniel

+0

S'il vous plaît poster l'instruction réelle. – RedFilter

0

Aborder votre nouvelle erreur msg sur « identifiant plusieurs parties 'jour',

Les colonnes day et year sont-elles dans le tableau? Qu'est-ce qui vient après le dans votre requête? Êtes-vous rejoindre plusieurs tables ensemble dans ce domaine? S'il vous plaît montrer la requête entière?

ok, basé sur la question sous la direction de yr, (Vous ne pouvez pas utiliser un alias dans un groupe par), essayez ceci:

select a.POL_PRI_RSK_ST_CD, 
    a.MASTER_COMPANY_NBR, 
    case when a.char046 is NULL then 'ERR' 
     when a.char046 > '010' then '11+' 
     else a.char046 end as Policy_Years, 
    a.Last7Days, a.Last30Days, a.Last90Days 
from reporting a 
    join Repository b 
     on a.RECORD_ID = b.RECORD_ID 
where a.POL_OGN_EFF_DT >= '2008-11-01' 
group by a.POL_PRI_RSK_ST_CD, 
    a.MASTER_COMPANY_NBR, 
    case when a.char046 is NULL then 'ERR' 
     when a.char046 > '010' then '11+' 
     else a.char046 end, 
    a.Last7Days, a.Last30Days, a.Last90Days 

mais en fait, vous n'avez pas des fonctions d'agrégation là-dedans du tout, à groupe par sur chaque expression dans la sélection, donc tout ce que vous avez besoin est un mot-clé Distinct, vous ne, pas besoin du groupe en tout:

select Distinct a.POL_PRI_RSK_ST_CD, 
    a.MASTER_COMPANY_NBR, 
    case when a.char046 is NULL then 'ERR' 
     when a.char046 > '010' then '11+' 
     else a.char046 end as Policy_Years, 
    a.Last7Days, a.Last30Days, a.Last90Days 
from reporting a 
    join Repository b 
     on a.RECORD_ID = b.RECORD_ID 
where a.POL_OGN_EFF_DT >= '2008-11-01' 
+0

sélectionnez \t a.POL_PRI_RSK_ST_CD en tant qu'Etat, a.MASTER_COMPANY_NBR comme Original_CO, cas \t lorsque a.char046 est NULL, 'ERR' \t lorsque a.char046> '010' puis 11+ » \t un autre. char046 fin comme Policy_Years, \t a.Last7Days, a.Last30Days, a.Last90Days de signaler une jointure interne Repository b sur a.RECORD_ID = b.RECORD_ID où a.POL_OGN_EFF_DT> = '01/11/2008' groupe par \t a.POL_PRI_RSK_ST_CD, a.MASTER_COMPANY_NBR, \t cas \t lorsque a.char046 est NULL puis 'ERR' \t lorsque a.char046> '010' puis '11 + ' \t sinon a.char046 fin comme Policy_Years, \t a.Last7Days, a.Last30Days, a.Last90Days – Daniel

+0

J'ai modifié la question. Merci – Daniel

0

vous ne pouvez pas utiliser un alias AS dans le GROUP BY. L'expression doit correspondre à l'expression dans votre SELECT sans l'alias.