给定 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
我有一个用于标记测试的存储过程。在我做标记之前,我首先像这样找出年级:
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