2014-04-03 38 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 

我希望這會幫助你, 好運

相關問題