2014-04-03 36 views
2

我有我student_marks表各类痕迹,让说Quiz1Quiz2Quiz3First_MonthlySecond_MonthlyThird_monthly如何找出来自不同列的两个最高值?

我创建了一个触发器,它可以计算所有标记并在Final_Marks字段中添加总和。

我不想Final_marks字段添加所有列,总结他们,我想只选择前2 Quiz_Marks和最上方的两个Monthly_Marks并添加FinalMarks它们的总和。

我在网上搜索,发现greatest关键字,从表中选择最高列值,但在这里我不想要一个单一的值,我需要对每个ID至少2个最高值。

-

触发[眼下其添加的所有列]

BEGIN 
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks 
         + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
         + NEW.ProjectMarks, 

enter image description here

+3

1.标准化您的设计 – Strawberry

+0

+1对不起,我吃了我的话 – Basic

+0

是不是正常化了?如果我进一步划分'student_marks'表,那么每次用户更新标记时可能很难更新'final_marks'列。 –

回答

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。

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 

我希望这会帮助你, 好运

相关问题