2017-05-25 43 views
1

要查找多个学生注册记录的最大等级,像KG和PS这样的Alpha等级显示为最大,尽管等级12会“更高”。有没有办法将非数字成绩设置为00,这样他们就不会显示为最大(除非学生只注册了非数字成绩)。我尝试了以下内容,甚至无法编译它。编译器不喜欢“何时不在”。感谢您提前寻找任何可行的解决方案。如果一个学生从KG到09年注册过去10年......我想看到09为最高年级水平。在Max语句之前/期间更改字段的值

DECLARE @grade char(2); 
SET @grade='00' 

Select 
SD.[Student_Number] as [Student_Number], 
Max (SE.[Grade_Level]) as [Grade_Level], 
     CASE SE.[Grade_Level] 
      when not in ('01','02','03','04','05','06','07',''08',''09','10','11','12') 
      then @grade 
      else (SE.[Grade_Level]) 
     End 
From 
Student_DemographicsCube as SD WITH (NOLOCK), 
Student_EnrollmentCube as SE WITH (NOLOCK) 
Where 
SD.[Student_ID] = SE.[Student_ID] 
Group By 
    SD.[Student_Number] 
Order By 
SD.[Student_Number] 

回答

0

您的查询有几个问题。首先,你应该使用显式的JOIN语法。其次,CASE表达式和Max()语法的格式不正确。尝试使用:

Select 
    SD.[Student_Number] as [Student_Number], 
    Max(CASE when SE.[Grade_Level] not in ('01','02','03','04','05','06','07','08','09','10','11','12') 
      then @grade 
      else SE.[Grade_Level] 
     End) as [Grade_Level] 
From Student_DemographicsCube as SD WITH (NOLOCK) 
Inner Join Student_EnrollmentCube as SE WITH (NOLOCK) 
    ON SD.[Student_ID] = SE.[Student_ID] 
Group By SD.[Student_Number] 
Order By SD.[Student_Number]; 

你会发现,我感动WHERE SD.[Student_ID] = SE.[Student_ID]INNER JOIN是明确要加入的表。那么CASE表达式的语法是CASE WHEN <some condition> THEN <something> ELSE <something else> END,它被置于MAX()聚合函数内。这应该解决你的语法问题。

+1

优秀...我用你的答案,它现在按预期工作!谢谢 ! –