给定 table 个范围值,我如何扫描它才能得出成绩?

Given a table of range values how can I scan through this to come up with a grade?

我有一个用于标记测试的存储过程。在我做标记之前,我首先像这样找出年级:

SELECT Grade.Name,
       Grade.Pass,
       Grade.Value
FROM        AdminTest
INNER JOIN  UserTest
ON      AdminTest.AdminTestId = UserTest.AdminTestId
INNER JOIN  Grade
ON      AdminTest.AdminTestId = Grade.AdminTestId 
WHERE       UserTest.UserTestId = @UserTestId

Name       Pass  Value
---------- ----- -----------
A          1     80
B          1     50
C          0     25
D          0      0

我有数字代表题目总数,正确与错误:

DECLARE @Answers              INT = 30
DECLARE @CorrectAnswers       INT = 20
DECLARE @IncorrectAnswers     INT = 10

DECLARE @Percentage = ( @CorrectAnswers / @Answers ) * 100;

有没有人知道如何使用我从 select 获得的 @Percentage 和成绩值,并用它来得出 @FinalGrade

我需要做的是采用@Percentage 并以某种方式将其匹配到本例中得出 'B' 的等级。

我真的很喜欢基于集合的方法,但我不确定这是否可行,所以也许使用游标是一种解决方案。

我希望有人能给我一些提示,告诉我应该怎么做。

您可以像这样找到最小值小于当前百分比的最大成绩:

select top 1 @FinalGrade = Name 
from Grade
where Value <= @Percentage
order by Value desc

不过要小心:而不是

DECLARE @Percentage = ( @CorrectAnswers / @Answers ) * 100;

您需要执行以下任一操作:

DECLARE @Percentage = ( convert(float, @CorrectAnswers) / @Answers ) * 100;

或:

DECLARE @Percentage = @CorrectAnswers * 100 / @Answers;

那是因为 @CorrectAnswers@Answers 是整数,使用您当前的表达式,您将得到它们之间的整数除法(例如:10 / 30 * 100 将是 0).


编辑:

合并后的select应该是这样的:

SELECT top 1 
    @FinalGrade = Grade.Name
FROM        AdminTest
INNER JOIN  UserTest
ON      AdminTest.AdminTestId = UserTest.AdminTestId
INNER JOIN  Grade
ON      AdminTest.AdminTestId = Grade.AdminTestId 
WHERE   UserTest.UserTestId = @UserTestId
and     Grade.Value <= @Percentage
order by Grade.Value desc