0

我正在尝试在我的网站上创建一个表格,显示“价值”最低的前 10 名学生。我的数据库中没有实际的“值”列,而是有两列标题为“grade1”和“grade2”。我的目标是让查询将最低 10 个结果显示为“值”,无论是在 Grade1 还是 Grade2 列中。

这是查询:

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/VALUE):

    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

正如您所看到的,出现了问题,因为值列中的前四个结果在应该是 Grade2 时显示为 NULL,但是在第 9 行它运行正常......

最后,另一个问题是,如果学生被评分 3 次或更多,我只希望查询包含结果。*注意:grade1 和grade2 实际上是同一考试的两个部分。每个学生的评分考试都是表 5 中的一行,其中包括一列 Grade1 和 Grade2。因此,如果有 3 行或更多行具有相同的学生 ID,则应包括他或她。

我是一名初学者程序员,此时我正在阻止,因为我不知道如何实现这一点,而且我的研究在这一点上只会让我更加困惑。感谢您的帮助。

4

1 回答 1

1

您的案例陈述说,如果学生的评分方法是“A”或“B”,则返回 Grade1 ...即使它为空。所以要么你需要:

  • 将学生的评分方法修改为不是“A”或“B”,或
  • 更改您的案例语句,将“AND Grade 1 is not null”添加到第一个 WHEN 条件,如果 Grade1 为 null,则回退到 Grade2

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

要获得 3 个成绩的学生,请将此 JOIN 添加到您的查询中:

INNER JOIN (select studentid from Table5 group by studentid having count(studentid) > 3) threeGrades on threeGrades.studentid = s.studentid
于 2013-03-07T17:07:27.950 回答