2013-03-07 112 views
0

我试图在我的网站上创建一个表格,显示最低'价值'的前10名学生。在我的数据库中没有实际的“值”列,而是有两列,分别是'grade1'和'grade2'。我的目标是查询将最低的10个结果显示为“值”,而不管它是在1级还是2级列中。SQL查询结束AS值无法正常工作

下面是查询:

SELECT TOP 10 p.class, e.teacher, k.notes, s.grade1, s.grade2 
      , s.gradedmethod, k.studentid 
      , CASE WHEN s.gradedmethod= 'A' OR s. gradedmethod= 'B' THEN s.grade1 
        ELSE s.grade2 END AS value 
FROM Table1 k 
INNER JOIN Table2 p ON p.class = k.class 
INNER JOIN Table3 d ON d.tier = p.tier 
INNER JOIN Table4 e ON e.teacher = p.teacher 
INNER JOIN Table5 s ON k.studentid = s.studentid 
WHERE s.examdate IN 
     (SELECT MAX(st.examdate) 
     FROM Table5 st 
     WHERE st.studentid = s.studentid 
     GROUP BY st.studentid) 
    AND k.reportcard IS NULL AND (k.cardtype = 'X' OR k.cardtype = 'Y') 
ORDER BY value ASC 

这里是输出样本(编辑:结果压缩为仅包括GRADE1/GRADE2 /值):

Class/Teacher/Notes/Grade1/Grade2/MeasureMethod/Studentid/Value 
    NULL/35/NULL 
    NULL/82/NULL 
    NULL/88/NULL 
    NULL/87/NULL 
    0/100//0 
    19/21/19 
    24/13/24 
    27/40/27 
    NULL/28/28 
    33/23/33 

正如你可以看到,有些事情出错了,因为值列中的前四个结果在显示为NULL时应该是Grade2,但是在第9行中它正常运行...

最后,anoth呃问题是我只希望查询包含结果,如果学生已被评分3次或更多。 *注意:1级和2级实际上是同一考试中的两个部分。每个学生评分考试都是表5中的一行,其中包括一级和二级。所以如果有三排或更多的同一学生,那么他或她应该被包括在内。

我是一名初学者程序员,在这一点上我阻止了,因为我不知道如何做到这一点,并且我的研究在这一点上让我更加困惑。感谢您的帮助。

+0

为什么你觉得他们应该已经grade2? ......我的意思是,这些行的分级方法不是'A'或'B'? – 2013-03-07 17:00:33

+0

您的结果难以阅读。你可以压缩它们来显示'grade1','grade2'和'value'吗? – 2013-03-07 17:03:18

+0

@KyleHale不,他们确实是A或B,那方面工作正常(但是,一旦我集成了你的INNER JOIN策略,我不得不在插入的第二次插入CASE时使用它)。不知道我是否理解你的问题,对不起。 – BillyCode 2013-03-08 15:58:38

回答

1

您的案例陈述说,如果学生的评分方法是“A”或“B”,则返回grade1即使它为空。 因此,无论您需要:

  • 修改学生的gradedmethods不为“A”或“B”,或
  • 改变你的case语句添加“和等级1不空”的第一个WHEN条件回落到grade2如果grade1是空

不知道什么要求(不显示非NULL的成绩?有什么gradedmethod做什么呢?)所以我不能告诉你肯定如何避免你看到的。

让学生有3个等级,增加此连接到您的查询:

INNER JOIN (select studentid from Table5 group by studentid having count(studentid) > 3) threeGrades on threeGrades.studentid = s.studentid 
+0

谢谢你的回答,非常有帮助。我仍然遇到的唯一问题是,它不会将GRADE2作为VALUE,直到它遇到GRADE1存在的行,如果GRADE1为NULL,则它将GRADE2指定为VALUE。奇怪... – BillyCode 2013-03-08 15:52:04

+0

我..不认为这是它在做什么。 CASE声明中说:“这个学生的评分方法是”A“还是”B“?如果是,则输入Grade1,否则输入Grade2。对于第9排,那个学生的分数方法是什么? – 2013-03-08 16:51:36