我的student_marks
表中有各种类型的标记,比如Quiz1
,Quiz2
,Quiz3
,First_Monthly
,Second_Monthly
, Third_monthly
。
我创建了一个触发器,用于计算所有标记并在Final_Marks
字段中添加总和。
我不希望Final_marks
字段添加所有列并对其求和,我只想选择前2 Quiz_Marks
和Top2 Monthly_Marks
并添加其总和FinalMarks
。
我在网上搜索并找到greatest
关键字,从表中选择最高列值,但在这里我不想要一个值,我需要至少2个最高值来对应每个ID。
-
触发[现在正在添加所有列]
BEGIN
SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
+ NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3
+ NEW.ProjectMarks,
答案 0 :(得分:1)
如果我理解你的问题是你的问题的解决方案,请使用此代码(此代码用于未知,您可以稍微修改它以适合您想要处理的数据:
DECLARE @v_type1 INT = 0
,@v_type2 INT = 0
,@v_type3 INT = 0;
WITH temp AS (
select 1 typeid, 12 note union all
select 1 typeid, 11 note union all
select 1 typeid, 13 note union all
select 2 typeid, 18 note union all
select 2 typeid, 19 note union all
select 2 typeid, 19 note union all
select 3 typeid, 21 note)
select
@v_type1 = @v_type1
+ISNULL(CASE WHEN typeid = 1 AND ROW_NUMBER() over (partition by typeid ORDER BY note DESC)<=2
THEN note
ELSE 0
END,0)
,@v_type2 = @v_type2
+ISNULL(CASE WHEN typeid = 2 AND ROW_NUMBER() over (partition by typeid ORDER BY note DESC)<=2
THEN note
ELSE 0
END,0)
,@v_type3 = @v_type3
+ISNULL(CASE WHEN typeid = 3 AND ROW_NUMBER() over (partition by typeid ORDER BY note DESC)<=2
THEN note
ELSE 0
END,0)
from temp
SELECT @v_type1,@v_type2,@v_type3
我希望这会对你有所帮助, 祝你好运
答案 1 :(得分:1)
您有五个值。为了获得最大,你使用GREATEST(当然)。要获得第二个最大值,请执行以下操作:仅为四个值的每个元组找到最大值。当然有五个元组,一个缺少元素1,一个缺少元素2等等。所以你得到的是所有五个中最大值的四倍,一次是第二个最大值。使用至少来获得第二个最大值。那就是它。
SET NEW.FinalMarks =
GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.hourly3, new.projectmarks)
+
LEAST
(
GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.hourly3),
GREATEST(new.quizmarks, new.hourly1, new.hourly2, new.projectmarks),
GREATEST(new.quizmarks, new.hourly1, new.hourly3, new.projectmarks),
GREATEST(new.quizmarks, new.hourly2, new.hourly3, new.projectmarks),
GREATEST(new.hourly1, new.hourly2, new.hourly3, new.projectmarks),
)
修改此内容,以便它符合您单独处理Quiz_Marks和Monthly_Marks的请求。