如何检查同一列的值范围

时间:2014-04-12 03:24:31

标签: sql sql-server-2012 union

这是我的表格:

enter image description here

现在,我想检查输入是否介于95-91或80-90或70-79之间......依此类推。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

在这里,我们将表格连接到自己,以获得每个等级的最小值和最大值。

select
    g1.Courseid,
    g1.GradeValue MinGradeValue,
    isnull(min(g2.GradeValue)-1,100) MaxGradeValue,
    g1.Description
from YourTable g1
    left join YourTable g2
        ON g2.CourseId = g1.CourseId
        and g2.GradeValue > g1.GradeValue
group by
    g1.Courseid,
    g1.GradeValue,
    g1.Description

您可以将此作为CTE或其他内容加入到Student.Grade between MinGradeValue and MaxGradeValue的学生成绩中。如果我能帮助你,请告诉我。

答案 1 :(得分:0)

首先,停止在包容性上限范围内思考;阅读this post关于BETWEEN(这是一个包容性范围) - 这适用于任何概念上整数(即几乎所有内容)的内容。当有人获得79.5成绩时会发生什么?

幸运的是,您的表格完美地用于构建边界范围表(可以在此处作为CTE完成,或者如果必要则可以在物化视图中完成)。我倾向于选择OLAP函数来完成这类工作(2012年有一个很好的工作):

SELECT courseId, description, 
       gradeValue as minimumValue, 
       LEAD(gradeValue) OVER(PARTITION BY courseId ORDER BY gradeValue) as nextGradeMinimumValue
FROM Grade

...然后您可以查询与此类似的内容:

SELECT StudentGrade.studentId, StudentGrade.courseId, StudentGrade.grade,
       Grade.description
FROM (VALUES(1, 1, 38),
            (2, 1, 99),
            (3, 2, 74.5),
            (4, 2, 120)) StudentGrade(studentId, courseId, grade)
JOIN (SELECT courseId, description, 
             gradeValue as minimumValue, 
             LEAD(gradeValue) OVER(PARTITION BY courseId ORDER BY gradeValue) as nextGradeMinimumValue
      FROM Grade) Grade
ON Grade.courseId = StudentGrade.courseId
   AND Grade.minimumValue >= StudentGrade.grade
   AND (Grade.nextGradeMinimumValue IS NULL OR Grade.nextGradeMinimumValue > StudentGrade.grade)

(通常我会有一个SQL小提琴示例,但我现在无法访问它,所以这是未经测试的。)
这适用于所有(正)等级范围,包括无限量的“额外学分”(任何高于最高边界的分数都被指定为该描述)。