在Max语句之前/期间更改字段的值

时间:2017-05-25 17:26:14

标签: mysql sql tsql

要查找多个学生注册记录的最高分数,像KG和PS这样的alpha等级显示为最大值,即使等级12为"更高"。有没有办法将非数字成绩设置为00,因此它们不会显示为最大值(除非学生仅注册非数字成绩)。我尝试了以下内容,甚至无法编译。编译器不喜欢"当不在"。提前感谢任何可行的解决方案。如果一名学生从KG到09年就读了最近10年...我想将09视为最高年级。

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] 

1 个答案:

答案 0 :(得分: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()聚合函数内部。这应该可以解决您遇到的语法问题。